[RESEAU] mk_socket
Proposé par smeagol

le 03 December 2006 à 12h 52mn 08s

17329 visualisations



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:

Code:

#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;
};

#1 

03-12-2006 13:08:27

smeagol
Membre
Date d'inscription: 30-10-2006
Messages: 34

Voici l'exemple de client

Code:

#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


#2 

15-12-2006 10:56:59

smeagol
Membre
Date d'inscription: 30-10-2006
Messages: 34

Ce post devait peut être déplacer dans le forum tutoriels.

Si vous avez des question n'hésiter pas

Hors ligne


#3 

16-12-2006 09:22:38

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

le code est directement compatible windows linux ?

Hors ligne


#4 

16-12-2006 16:39:11

smeagol
Membre
Date d'inscription: 30-10-2006
Messages: 34

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


#5 

24-01-2007 03:41:57

maitrelame12545
Membre
Date d'inscription: 28-11-2006
Messages: 51

Je comprend pas ce que tu veux par l'invite de commande... je sais pas ce que c'est..
a+


Codeur elewendyl

Hors ligne


#6 

24-01-2007 14:38:21

smeagol
Membre
Date d'inscription: 30-10-2006
Messages: 34

Tape démarrer executer et tape cmd. le voila l'invite de commande dans windob

Hors ligne


#7 

24-01-2007 22:35:07

maitrelame12545
Membre
Date d'inscription: 28-11-2006
Messages: 51

a ok merci et tape : EDIT.COM pour tomber sur un editeur de texte asm ! ;-)


Codeur elewendyl

Hors ligne


#8 

19-02-2007 06:58:43

maitrelame12545
Membre
Date d'inscription: 28-11-2006
Messages: 51

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+


Codeur elewendyl

Hors ligne


#9 

19-02-2007 09:22:09

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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 smile

a mort les IDE !!

Dernière modification par Jerry Kan (19-02-2007 09:38:30)

Hors ligne


#10 

19-02-2007 18:23:54

maitrelame12545
Membre
Date d'inscription: 28-11-2006
Messages: 51

C'est bon je devais juste linker winsock avec !
Merci
a+


Codeur elewendyl

Hors ligne


#11 

04-03-2007 14:31:50

katsankat
Membre
Date d'inscription: 24-02-2007
Messages: 43

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


#12 

04-03-2007 19:41:39

Jerry Kan
Habitué
Date d'inscription: 21-11-2006
Messages: 265

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


#13 

20-03-2007 05:29:43

maitrelame12545
Membre
Date d'inscription: 28-11-2006
Messages: 51

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+


Codeur elewendyl

Hors ligne


#14 

20-03-2007 09:26:58

khayyam
Membre
Date d'inscription: 04-03-2007
Messages: 25
Site web

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


#15 

20-03-2007 13:27:22

smeagol
Membre
Date d'inscription: 30-10-2006
Messages: 34

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


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
22 invités en ligne
Aucun membre connecté
RSS Feed