[RESEAU] mk_socket

Proposé par smeagol

le 03 December 2006 à 11h 52mn 08s

20502 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:

#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 12:08:27

smeagol
Membres
Date d'inscription:
Messages: 34
IP: 86.193.76.105
Courriel

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


#2 

15-12-2006 09:56:59

smeagol
Membres
Date d'inscription:
Messages: 34
IP: 195.221.49.61
Courriel

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 08:22:38

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

le code est directement compatible windows linux ?

Hors ligne


#4 

16-12-2006 15:39:11

smeagol
Membres
Date d'inscription:
Messages: 34
IP: 90.0.33.157
Courriel

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 02:41:57

maitrelame12545
Membres
Avatar de maitrelame12545
Date d'inscription:
Messages: 51
IP: 76.168.151.216
Courriel

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

Hors ligne


#6 

24-01-2007 13:38:21

smeagol
Membres
Date d'inscription:
Messages: 34
IP: 195.83.76.99
Courriel

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

Hors ligne


#7 

24-01-2007 21:35:07

maitrelame12545
Membres
Avatar de maitrelame12545
Date d'inscription:
Messages: 51
IP: 76.168.151.216
Courriel

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

Hors ligne


#8 

19-02-2007 05:58:43

maitrelame12545
Membres
Avatar de maitrelame12545
Date d'inscription:
Messages: 51
IP: 76.80.53.159
Courriel

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


#9 

19-02-2007 08:22:09

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

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 :

&quot;JK&quot; Ecris:

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 :

&quot;JK&quot; Ecris:

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 !!

Hors ligne


#10 

19-02-2007 17:23:54

maitrelame12545
Membres
Avatar de maitrelame12545
Date d'inscription:
Messages: 51
IP: 76.80.53.159
Courriel

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

Hors ligne


#11 

04-03-2007 13:31:50

katsankat
Membres
Date d'inscription:
Messages: 43
IP: 86.209.83.9
Courriel

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_SOCKET-BIBLIOTHEQUE-COMPLETE-TRES-SIMPLE-GESTION-SOCKET-TCP_35366.aspx

Hors ligne


#12 

04-03-2007 18:41:39

Jerry Kan
Membres
Date d'inscription:
Messages: 265
IP: 82.243.77.149
Courriel

katsankat Ecris:

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_SOCKET-BIBLIOTHEQUE-COMPLETE-TRES-SIMPLE-GESTION-SOCKET-TCP_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 04:29:43

maitrelame12545
Membres
Avatar de maitrelame12545
Date d'inscription:
Messages: 51
IP: 76.80.53.159
Courriel

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


#14 

20-03-2007 08:26:58

khayyam
Membres
Date d'inscription:
Messages: 25
IP: 130.79.72.239
Courriel  Site web

maitrelame12545 Ecris:

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 12:27:22

smeagol
Membres
Date d'inscription:
Messages: 34
IP: 193.55.51.9
Courriel

katsankat Ecris:

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_SOCKET-BIBLIOTHEQUE-COMPLETE-TRES-SIMPLE-GESTION-SOCKET-TCP_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

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
159 invités en ligne
membre en ligne: -
RSS Feed