Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LIBCONNECT - BIBLIOTHÈQUE C++ DE CONNEXION


Information sur la source

Catégorie :Réseaux & Internet Classé sous : socket, tcp, udp, broadcast, connexion Niveau : Initié Date de création : 16/07/2007 Date de mise à jour : 19/07/2007 10:52:20 Vu / téléchargé: 6 891 / 475

Note :
7,33 / 10 - par 3 personnes
7,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

Description

Le but de cette bibliothèque est de proposer une interface très facile d'utilisation à la manipulation des sockets.
libconnect est:

    * une bibliothèque de connexion de très haut niveau
    * indépendant de l'OS --> fonctionne/testé sous Linux/MacOS/Windows XP (SP2) et probablement sur toutes les plateformes UNIX
    * très modulaire (de nouveau protocoles peuvent être ajoutés très simplement)

Pour le moment cette bibliothèque implémente les protocoles TCP et UDP et supporte également le BROADCAST UDP.

------------------

Lors de la compilation, 2 fichiers sont générés, un pour la partie serveur (libconnectS.x) et un pour la partie client (libconnectC.x).

Voir doc/html/index.html pour la doc détaillée de la bibliothèque.
 

Source

  • Voici un exemple de main coté serveur (coté client + ou - identique) :
  • #include <connection.hpp>
  • #include <tcp.hpp>
  • #include <udp.hpp>
  • #include <iostream>
  • #include <archi.hpp>
  • using namespace std;
  • using namespace connection;
  • // struct/class fait main pour montrer qu'on peut envoyer/recevoir ce que l'on veut
  • struct Foo : public Transmissible
  • {
  • public :
  • float a;
  • float b;
  • float c;
  • Foo(){}
  • ~Foo(){}
  • virtual void send(const Connection & ct) const
  • {
  • ct.send(a);
  • ct.send(b);
  • ct.send(c);
  • }
  • virtual void receive(Connection & ct)
  • {
  • ct.receive(a);
  • ct.receive(b);
  • ct.receive(c);
  • }
  • };
  • int main()
  • {
  • // Connexion UDP BROADCAST sur le port 24558
  • Connection *c = new Connection("", 24558, new UDP, BROADCAST);
  • int a = 123;
  • float b = 4.56;
  • char d = 'c';
  • string s = "hello";
  • int i[3];
  • i[0] = 12;
  • i[1] = 53;
  • i[2] = 89;
  • Foo f;
  • f.a = 11.1;
  • f.b = 22.2;
  • f.c = 33.3;
  • tempo(1000);
  • cout << "ENVOI de : " << a << endl;
  • *c << a;
  • cout << "ENVOI de : " << b << endl;
  • *c << b;
  • cout << "ENVOI de : " << d << endl;
  • *c << d;
  • cout << "ENVOI de : " << s << endl;
  • *c << s;
  • cout << "ENVOI de : (array) " << s << endl;
  • *c << array<char>(&(s)[0], s.size());;
  • cout << "ENVOI de : " << "i[3]" << endl;
  • *c << i;
  • cout << "ENVOI de Foo : " << f.a << " " << f.b << " " << f.c << endl;
  • *c << f;
  • tempo(1000);
  • while (!c->listen())
  • cout << "DATA RECEIVED" << endl;
  • int z;
  • *c >> z;
  • cout << z << endl;
  • delete c;
  • return 0;
  • }
Voici un exemple de main coté serveur (coté client + ou - identique) :

#include <connection.hpp>
#include <tcp.hpp>
#include <udp.hpp>
#include <iostream>
#include <archi.hpp>

using namespace std;
using namespace connection;

// struct/class fait main pour montrer qu'on peut envoyer/recevoir ce que l'on veut
struct Foo : public Transmissible
{
  public :
  float a;
  float b;
  float c;

  Foo(){}
  ~Foo(){}

  virtual void send(const Connection & ct) const
  {
      ct.send(a);
      ct.send(b);
      ct.send(c);
  }

  virtual void receive(Connection & ct)
  {
    ct.receive(a);
    ct.receive(b);
    ct.receive(c);
  }

};


int main()
{
        // Connexion UDP BROADCAST sur le port 24558
        Connection *c = new Connection("", 24558, new UDP, BROADCAST);
        int    a = 123;
        float  b = 4.56;
        char   d = 'c';
        string s = "hello";

	int i[3];
	i[0] = 12;
	i[1] = 53;
	i[2] = 89;

	Foo f;
        f.a = 11.1;
        f.b = 22.2;
        f.c = 33.3;

        tempo(1000);
        cout << "ENVOI de : " << a <<  endl;
        *c << a;

        cout << "ENVOI de : " << b <<  endl;
        *c << b;

        cout << "ENVOI de : " << d <<  endl;
        *c << d;

        cout << "ENVOI de : " << s <<  endl;
        *c << s;

        cout << "ENVOI de : (array) " << s  <<  endl;
        *c << array<char>(&(s)[0], s.size());;

        cout << "ENVOI de : " << "i[3]"  <<  endl;
        *c << i;

	cout << "ENVOI de Foo : " << f.a << " " << f.b << " " << f.c << endl;
	*c << f;


        tempo(1000);

        while (!c->listen())
        cout << "DATA RECEIVED" <<  endl;
        int z;
        *c >> z;
        cout <<  z <<  endl;

        delete c;

  return 0;
}

Conclusion

BUGS:
- Sous visual (uniquement), la bibliothèque ne compile pas si j'utilise <winsock2.h> , il faut que je mette <winsock.h>, si quelqu'un sait pourquoi ? [corrigé]


TODO :
- Ajout d'un en-tête unique (un seul .hpp à inclure)
- Le support du multicast (j'ai le code en rayon, il faut juste que je l'adapte)
- Le support des raw sockets (si quelqu'un a un code clair je suis preneur)
- Le support de l'ipv6 (à l'occasion)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

17 juillet 2007 14:55:41 :
ADD : detection des compilos FIX : warnings vc8 MAJ : fichiers projet vc8 MAJ : doc
19 juillet 2007 10:52:24 :
Ajouts de projets Code::Blocks (dans makefiles/win32) pour compiler 2 executables (client/serveur)

Commentaires et avis

signaler à un administrateur
Commentaire de crunch117 le 16/07/2007 19:07:39

C'est pas mal du tout, je te met un 8/10!

Mais dis-moi il n'y aurait pas un peu trop de fichiers pour un projet de cette taille ?

Il y a des méthodes que j'ai déja vu qui sont tout a fait dans l'esprit d'un wrapper C++ qui encapsulerait les fonctions des sockets, c'est l'utilisation de flux, genre a chaque socket tu associes un flux qui prends en charge les envois/réceptions, comme cela, l'utilisateur n'a plus à se soucier de la manière dont les données sont transmises (les opérateurs << et >> font très bien l'affaire !).

Une dernière chose, j'ai vu que tu avais prévu d'ajouter la compatibilité avec Sun, où en est tu ?

signaler à un administrateur
Commentaire de turnerom le 16/07/2007 19:49:15

Les fichiers sont nombreux car il y'a la doc au format html/Doxygen dans l'archive.
Sinon, pour sun, je ne sais pas ou tu as vu ca. Je n'ai pas de sun sous la main, mais si quelqu'un veut faire le portage (ce qui ne doit pas être très compliqué) je l'ajouterai bien volontiers au projet.

signaler à un administrateur
Commentaire de AimLess le 19/07/2007 01:12:14

Bonsoir,

pour mainS sous dev-c++ pas de soucis WAITING TRANSMISSION DATA mais pour le MainC j'ai le message : "This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information."

Quelqu'un aurait-t-il une idée ? merci d'avance

signaler à un administrateur
Commentaire de turnerom le 19/07/2007 01:21:33

As-tu utilisé les 2 fichiers main présent ou les as-tu modifiés?
Car dans l'exemple c'est de l'udp donc le client doit être lancé en 1er puis le serveur.

signaler à un administrateur
Commentaire de AimLess le 19/07/2007 01:38:58

Houla bah alors pas au lit ;-) Merci pour la réponse

J'ai gardé tes fichiers sources, et l'ordre d'exécution est respecté.

(Je lance les deux applications sur le même PC... Est ce un problème docteur ?)

signaler à un administrateur
Commentaire de turnerom le 19/07/2007 10:47:14

Je viens de retester, chez moi ca marche. Je suis sous XP (SP2) je compile avec gcc version 3.4.4 (mingw special) sous Code::Blocks. Et je lance le client puis le serveur sans rien toucher sa marche.

signaler à un administrateur
Commentaire de turnerom le 19/07/2007 10:54:25

J'ai rajouté les 2 projet qui m'ont servi à faire les executables dans makefiles/win32. Essaye de compiler avec pour voir.

signaler à un administrateur
Commentaire de AimLess le 19/07/2007 15:02:33

Merci pour tes réponses...
D'acc, je me suis mis sous Code::Block et maintenant j'ai le message :

Switching to target: Release
Project   : libC
Compiler  : GNU GCC Compiler (called directly)
Directory : E:\dev\cppfrance_LIBCONNECT-BIBLIOTH-200-CPLUSPLUS-CONNEXION_43473 -2\libconnect\makefiles\win32\
--------------------------------------------------------------------------------
Switching to target: Release
Linking console executable: ..\..\build\win32\libC.exe
C:\Program Files\CodeBlocks\lib\libmingw32.a(main.o):main.c:(.text+0x106): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings



signaler à un administrateur
Commentaire de AimLess le 19/07/2007 15:26:59

Re bonjour Turnerom,

C'est ok pour moi sous code block :
  - Téléchargement de code block 1rc02
  - Puis installation de la nightybuild (du jour)
  + wxwidget (enfin la dll pour la nightybuild)

Recompilation des biblio statics et des exes... Et ça tourne

Merci pour l'aide,

signaler à un administrateur
Commentaire de AimLess le 19/07/2007 15:31:35

Question pour ma culture perso :
  - Que penses tu de l'intéropabilité de WXWidget ?
  - Code block fonctionne réellment sous tous les OS comme j'ai pu le lire ? L'IHM de Code::Block est développé sous WxWidget ?
  
Merci d'avance pour tes lumières

Amic,

Cpt Aimless

  

signaler à un administrateur
Commentaire de turnerom le 19/07/2007 15:43:44

tu as du te planter quelquepart dans la manip, parceque la il essaye de compiler main.c alors que mes fichiers s'appellent mainC.cpp et mainS.cpp.
Arrives-tu à compiler un programme tout simple avec C::B ?

signaler à un administrateur
Commentaire de turnerom le 19/07/2007 15:46:39

oui j'ai testé C::B sous linux et MAC ca marche.
Mais sur linux je préfère quand même utiliser Xemacs + makefile.

sinon wxwidget je suis pas fan, pour des interfaces graph de qualité multiplateforme y'a rien de mieu que Qt

signaler à un administrateur
Commentaire de Sphost le 01/08/2007 23:33:52

Bonjour,

Tout d'abord merci pour ce code.

Je suis sous Ubuntu et je rencontre des problèmes avec ce prog :
  Au début impossible de lancer le serveur après le client, car il revenait en erreur dès le début, après avoir fouillé un peu je me suis rendu compte que le MakeFile-server sous linux n'était pas bon car on compilait mainC.cpp au lieu de mainS.cpp.
  Après correction quand je lance le client et le serveur séparément ça passe, mais dès que je lance les deux (d'abord le client, puis le serveur) le serveur plante directement :
"./libconnectS
terminate called after throwing an instance of 'std::string'
Abandon"
Et là pas moyen de savoir d'où vient le problème (sachant que mes connaissances sont limitées) rencontres-tu le problème également?
Pour info, je n'ai rien changé au code, juste compiler puis exécuter.

signaler à un administrateur
Commentaire de ldubost le 13/08/2007 09:09:42

Bonjour,
Je suis sous LINUX Redhat Enterprise 4.0 et j'ai le même problème que "Sphost".
A priori l'erreur vient de cette ligne :
--> string err ( "baratin" + WSAGetLastError () ) ;  
Je l'ai remplacé par :
--> string err ( "baratin" ) ;
--> perror ( "Error message : " ) ;
Cela supprime le plantage lors de l'affichage de l'erreur.

Sinon j'ai ajouté aussi danns udp.cpp ligne 121 un htonl()
--> id_client.server.sin_addr.s_addr=htonl(INADDR_ANY) ;
Cela supprime le plantage du client.

Par contre la communication ne fonctionne toujours pas ...

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Socket TCP/UDP [ par hobbes ] Bonjour,j ai cru comprendre qu il existe 2 types de sockets (TCP et UDP) pouvant permettre l echange de donnees entre 2 applications sur le reseau.Pou raw socket et protocole TCP/IP [ par robertmouac ] Bonjour tout le monde. Je suis en train de coder une version simplifier du protocol TCP/IP en raw socket. Je formate et deformate bien les trames (ve Pb connexion HTTP avec socket. [ par LuckyNut ] Bonjour,J'ai fait un prog permettant de lire des pages html à partir des sockets. Tout marche chez moi mais le programme ne marche pas chez un pote qu Thread et socket udp [ par eurysthe ] Bonjour !!Voila j'ai un petit problème de thread qui me pourrit la vie.J'ai crée un thread qui doit écouter en boucle les informations qui transite su recherche exemple [ par doberman7578 ] Dans le cadre d'un projet en bts informatique(en C sous linux), je dois effectu&#233; un sereur client transfert d'image ( ce que j'aieffectu&#233;) m Envoi de message UDP sans socket ???? [ par thealex321 ] Salut &#224; tous!Bon, ma question est vraiment parce que je ne comprends pas comment on peut envoy&#233; un message sans cr&#233;er un socket pour l' (SOCKET) Tester si des ports TCP sont libres [ par supergrey ] Voila pour mon programme qui utilise les sockets j'ai besoin de 3 ports libres, de pr&#233;f&#233;rence cons&#233;cutifs, pour se connecter &#224; 3 s problème serveur TCP en C [ par lenneth666 ] Bonjour j'ai essay&#233; de faire un client server TCP en C mais mon serveur bloque a l'instruction suivante : client_socket = accept( ma_socket,(s probleme socket + API ( +thread ?) [ par lolorenzeb ] Bonjour à tous,Voila j'avais deja poster dans un précédent sujet mais comme j'ai revu tout mon code cela va etre plus simple de répondre. J'ai donc cr Problème linkage [ par M5i9k ] Salut à tous!Je débute les socket en c++ et j'ai un problème à la compilation, est-ce que quelqu'un pourrait m'expliquer, voici mon code :// Serveur T


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.