Libconnect - bibliothèque c++ de connexion

Soyez le premier à donner votre avis sur cette source.

Vue 12 101 fois - Téléchargée 768 fois

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 / Exemple :


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)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
13 août 2007

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 ...
Messages postés
1
Date d'inscription
mercredi 2 novembre 2005
Statut
Membre
Dernière intervention
1 août 2007

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.
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
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
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
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 ?
Messages postés
7
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
19 juillet 2007

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
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.