Bon voici une librairie très utile et très simple d'utilisation pour des socket TCP multi-thread voici un petit exemple
Pour l'utiliser vous avez besien de mk_socket.a et mk_socket.h pour faire une version VS il faut la recompiler.
voici un exemple de server:
#include <iostream> #include "mk_socket.h" //Cette fonction est appelée par le socket lorsque qu'un autre socket se connecte au serveur. void on_connection_request(mk_socket& sck,void* data) ; // mk_socket est une réference vers le socket en utilisation // data est un pointeur vers une donnée envoyer pour l'utiliser n'oublier pas de le caster //Cette fonction est appelé lorsque des données arrive du réseau. La fonction ne fait qu'imprimer ce texte à l'écran. void on_data_arrival(mk_socket& sck, char* str, int size, void* data); // mk_socket est une réference vers le socket en utilisation // str est la chaine de caractère ressu // size est la taille de str // data est un pointeur vers une donnée envoyer pour l'utiliser n'oublier pas de le caster int main() { mk_socket sock //création du mk socket // Affecte les fonction callback de connection et de reception de donnée // Le NULL peux être remplacé par une adresse mémoire ressue par l'attribut 'data'(voir plus haut) sock.SetConnectionRequestCallBack(on_connection_request, NULL); sock.SetDataArrivalCallBack(on_data_arrival, NULL); int port; std::cout << "port ?" << std::endl; std::cin >> port; //Écoute sur le port sock.Listen(port); //On attend que la connection se ferme et que le socket n'écoute plus. sock..WaitClose(); return EXIT_SUCCESS; }; void on_connection_request(mk_socket& sck,void* data) { //On accepte la connexion, et on utilise pour celà le socket qui écoutait précédemment. De toute manière, on n'attend plus d'autre connexions. //Attention garder le si vous vouler écouter encore sur votre port sck.Accept(sck); while(1) //n'arrête pas deboucler { char texte [100]; std::cin >> texte; sck.Send(texte); } }; void on_data_arrival(mk_socket& sck, char* str, int size, void* data) { std::cout << str << endl; //Écrit le texte reçu return; };
Voici l'exemple de client
#include <iostream> #include "mk_socket.h" //Cette fonction est appelée après que le socket se soit connecté au serveur void on_connect(mk_socket& sck,void* data); // mk_socket est une réference vers le socket en utilisation // data est un pointeur vers une donnée envoyer pour l'utiliser n'oublier pas de le caster //Cette fonction est appelé lorsque des données arrive du réseau. La fonction ne fait qu'imprimer ce texte à l'écran. void on_data_arrival(mk_socket& sck, char* str, int size, void* data); // mk_socket est une réference vers le socket en utilisation // str est la chaine de caractère ressu // size est la taille de str // data est un pointeur vers une donnée envoyer pour l'utiliser n'oublier pas de le caster int main() { mk_socket sock //création du mk socket // Affecte les fonction callback de connection et de reception de donnée // Le NULL peux être remplacé par une adresse mémoire ressue par l'attribut 'data'(voir plus haut) sock.SetOnConnectCallBack(on_connect, NULL); //Cette fonction est obligatoire comme la 'requeste' pour le server sock.SetDataArrivalCallBack(on_data_arrival, NULL); int port; std::cout << "port ?" << std::endl; std::cin >> port; char adr[100]; std::cout << "adresse ?" << std::endl; std::cin >> adr; //Se connecte au server sock.Connect(serv,port); //On attend que la connection se ferme et que le socket n'écoute plus. sock..WaitClose(); return EXIT_SUCCESS; }; void on_connect(mk_socket& sck,void* data) { while(1) //n'arrête pas deboucler { char texte [100]; std::cin >> texte; sck.Send(texte); } }; void on_data_arrival(mk_socket& sck, char* str, int size, void* data) { std::cout << str << endl; //Écrit le texte reçu return; };
Hors ligne
Ce post devait peut être déplacer dans le forum tutoriels.
Si vous avez des question n'hésiter pas
Hors ligne
le code est directement compatible windows linux ?
Hors ligne
Oui la lib est compatible win et linux. La lib est disponible sur l'upload. Elle n'est aps de moi je l'est juste debugguer.
Hors ligne
Je comprend pas ce que tu veux par l'invite de commande... je sais pas ce que c'est..
a+
Hors ligne
Tape démarrer executer et tape cmd. le voila l'invite de commande dans windob
Hors ligne
a ok merci et tape : EDIT.COM pour tomber sur un editeur de texte asm ! ;-)
Hors ligne
Salut jai un blem quand j'essaye de compiler un projet sous dev-cpp avec la lib...
Je link mk_socket.a
Je met les header dans les includes mais quand je compile le tuto de smea voila ce que j'ai :
Compilateur: Default compiler
Building Makefile: "C:\Dev-Cpp\Makefile.win"
Exécution de make...
make.exe -f "C:\Dev-Cpp\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"lib/gcc/mingw32/3.4.2/include" -I"include/c++/3.4.2/backward" -I"include/c++/3.4.2/mingw32" -I"include/c++/3.4.2" -I"include" -I"E:/travail/source/Sources/src/mk_socket"
g++.exe main.o -o "Projet1.exe" -L"lib" -L"E:/travail/source/Sources/src/mk_socket" E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0xe2):mk_socket.cpp: undefined reference to `WSAStartup@8'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x18c):mk_socket.cpp: undefined reference to `WSAStartup@8'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x236):mk_socket.cpp: undefined reference to `WSAStartup@8'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x336):mk_socket.cpp: undefined reference to `WSAStartup@8'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x42a):mk_socket.cpp: undefined reference to `WSACleanup@0'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x47a):mk_socket.cpp: undefined reference to `WSACleanup@0'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x4ca):mk_socket.cpp: undefined reference to `WSACleanup@0'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x64b):mk_socket.cpp: undefined reference to `socket@12'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x683):mk_socket.cpp: undefined reference to `connect@12'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x729):mk_socket.cpp: undefined reference to `closesocket@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x784):mk_socket.cpp: undefined reference to `socket@12'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x7da):mk_socket.cpp: undefined reference to `bind@12'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x7ef):mk_socket.cpp: undefined reference to `closesocket@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x811):mk_socket.cpp: undefined reference to `listen@8'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x826):mk_socket.cpp: undefined reference to `closesocket@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x8b8):mk_socket.cpp: undefined reference to `closesocket@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0x974):mk_socket.cpp: undefined reference to `send@16'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0xa48):mk_socket.cpp: undefined reference to `recv@16'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0xae3):mk_socket.cpp: undefined reference to `accept@12'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0xb44):mk_socket.cpp: undefined reference to `closesocket@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(mk_socket.o)(.text+0xb98):mk_socket.cpp: undefined reference to `closesocket@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(gestion.o)(.text+0x1e):gestion.cpp: undefined reference to `htons@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(gestion.o)(.text+0x68):gestion.cpp: undefined reference to `gethostbyname@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(gestion.o)(.text+0x8f):gestion.cpp: undefined reference to `inet_ntoa@4'
E:/travail/source/Sources/src/mk_socket/release/dev/mk_socket.a(gestion.o)(.text+0x9a):gestion.cpp: undefined reference to `inet_addr@4'
Merci a+
Hors ligne
bon je suis pas spécialiste de Dev, (loin de la, je déteste ce truc et je desteste bosser sous windows) mais dans mon tuto sur les threads posix, j explique que la procedure pour inclure des .h et .a est la suivante :
"JK" :
prends les .h et copie les dans DevCpp\include\
prends les .a et .lib et copie les dans DevCpp\lib
prends les .dll et copie les dans Dev-Cpp/bin (si yen a)
jusque la tu l'a fait, mais si j'ai bien suivit tu n'a pas fait ca :
"JK" :
Cree un projet
Va dans Projet/option du projet/ choisis l'onglet parametre
clique sur "ajouter fichier", trouve les .lib et les .a et ajoute les
si tu a du mal a les retrouver dans DevCpp\lib, tu peux aussi copier les .lib et les .a dans le repertoire projet (ou ailleur) et les lier de la meme facon, tu pourra alors déplacer ton répertoire sans souci
si tu l'a fait essaie de voir si il n'y a pas besoin d'arguments a passer, (les memes arguments que tu mettrais si tu programmais en console par exemple -pthread -XGL etc )
pour faire ca il faut faire :
Projet / Projet Option / parameters et la tu t'occupe que des onglets compiler et linker avec un copier collé de tes parametres
tu peut aussi tenter d'activer/mettre a jour l'auto completion, (recherche auto des header) avec Editor Option / Class Browsing / Completion
sinon si comme moi tu trouve qu'il faut 3 plombes, 3 000 Clics et 32 fenetres pour inclure 1 header pourri, installe linux et compile en ligne de commande, au moins on sait exactement ce qu'on fait
a mort les IDE !!
Dernière modification par Jerry Kan (19-02-2007 09:38:30)
Hors ligne
C'est bon je devais juste linker winsock avec !
Merci
a+
Hors ligne
Jerry Kan: ça compile sous linux, mais la gestion des threads pose problème à l' exécution.
Citez vos sources les amis http://www.cppfrance.com/codes/MK_SOCKE … 35366.aspx
Hors ligne
katsankat :
Jerry Kan: ça compile sous linux, mais la gestion des threads pose problème à l' exécution.
Citez vos sources les amis http://www.cppfrance.com/codes/MK_SOCKE … 35366.aspx
arf, peut pas t'aider sur les mk_socket, par principe, j'utilise pas tout ce qui est basé sur une macro dans un .h qui fait un binding vers une lib système différente , le comportement est toujours différent et c'est rapidement la merde a débugger, (par exemple, en windows, les sockets n'existent pas nativement ... )
le mieux est de prendre une librairie complete et portable
par contre, si tu veux faire du réseau sous linux, je peux t'aider, j'ai plusieurs exemples de client/serveur (mais entierement écrit avec les primitives systèmes linux
Hors ligne
Je me suis mit a cette lib pour de bon et la j'ai un probleme...
Comment faire pour recevoir des donne dans une autre fonction ?
Merci A+
Hors ligne
maitrelame12545 :
Je me suis mit a cette lib pour de bon et la j'ai un probleme...
Comment faire pour recevoir des donne dans une autre fonction ?
euh ... bah il suffit d'envoyer les données que tu reçois dans la fonction qui t'intéresse. Tu définis un callback avec SetDataArrivalCallBack, tu récupères tes données dans ce callback et ensuite tu peux les envoyer où tu veux, où est le problème ?
Et puis, c'est pas forcément très malin de demander de l'aide pour une bibliothèque utilisée par une poignée de personnes dans le monde.
Hors ligne
katsankat :
Jerry Kan: ça compile sous linux, mais la gestion des threads pose problème à l' exécution.
Citez vos sources les amis http://www.cppfrance.com/codes/MK_SOCKE … 35366.aspx
Désoler vue que sa fait longtemps que je l'utilise je n'avais plus le lien. Mais il faut savoir que la gestion des thread ne pose plus aucun problème. Comme je l'ai dit j'ai débugguer la lib pour qu'elle ne plante plus sous linux. Donc si on prend la librairie sur le téléchargement du site elle fonctionne même mieux sous linux.
PS: je conseil vraiment cette lib pour des application rapide car elle est facile a prendre en main. Bien sur elle est moins complète que d'autre lib.
La lib du forum ici
Dernière modification par smeagol (20-03-2007 13:28:51)
Hors ligne
Pages: 1