begin process at 2010 02 10 08:02:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > BIBLIOTHÈQUE PERMETTANT D'UTILISER LES SOCKETS DE MANIÈRE TRANSPARENTE QU'ELLES SOIENT WINDOWS / UNIX ET TCP / UDP

BIBLIOTHÈQUE PERMETTANT D'UTILISER LES SOCKETS DE MANIÈRE TRANSPARENTE QU'ELLES SOIENT WINDOWS / UNIX ET TCP / UDP


 Information sur la source

Note :
7 / 10 - par 2 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseaux & Internet Classé sous :udp, tcp, socket, winsock, connection Niveau :Initié Date de création :24/04/2006 Date de mise à jour :25/04/2006 14:44:10 Vu / téléchargé :8 235 / 1 066

Auteur : turnerom

Ecrire un message privé
Site perso
Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note

 Description

Ce code c++ sans class permet d'utiliser des sockets compatibles Windows et UNIX. Sans avoir à ce soucier des différences de programmation entre une socket TCP et UDP.

J'ai réaliser cette "bibliothèque" car je programme des sockets Windows et UNIX, TCP et UDP, et j'en avais marre d'avoir à changer le code à chaque fois, un simple #include "socket.hpp" et #define TCP ou UDP suffit maintenant. Un gain de temps et une portabilité non négligeable.

Sous windows ne pas oublier de linker avec "libwsock32.a"

N'hésitez pas à laisser des commentaires pour que je puisse améliorer mon code !

Source

  • /*-------------SOCKET.HPP-------------*/
  • // Socket library -*- C++ -*-
  • // Copyright (C) 2006 Christophe Tournayre
  • //
  • // This library is free software; you can redistribute it
  • // and/or modify it under the terms of the GNU General Public License
  • // as published by the Free Software Foundation; either version 2, or
  • // (at your option) any later version.
  • // This library is distributed in the hope that it will be useful,
  • // but WITHOUT ANY WARRANTY; without even the implied warranty of
  • // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  • // GNU General Public License for more details.
  • // As a special exception, you may use this file as part of a free software
  • // library without restriction. Specifically, if other files instantiate
  • // templates or use macros or inline functions from this file, or you compile
  • // this file and link it with other files to produce an executable, this
  • // file does not by itself cause the resulting executable to be covered by
  • // the GNU General Public License. This exception does not however
  • // invalidate any other reasons why the executable file might be covered by
  • // the GNU General Public License.
  • #ifndef __SOCKET_HPP__
  • #define __SOCKET_HPP__
  • // ********************************************************
  • // Les includes
  • // ********************************************************
  • #if defined(WIN32)
  • #include <winsock2.h> // pour les fonctions socket
  • #else
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <linux/socket.h>
  • #endif
  • #include <string>
  • #include <iostream> //Pour cout, cin, cerr
  • // ********************************************************
  • // Déclaration des structures et ENUM
  • // ********************************************************
  • enum Type {Udp, Tcp};
  • // Structure pour l'inforamtion de la socket
  • typedef struct
  • {
  • SOCKET id; // Déclaration de l'identifiant e la socket
  • SOCKADDR_IN server; // Déclaration de la structure des informations lié au serveur
  • } Sock;
  • // Structure pour la fonction Recv (nb contient le nb de charactere recus, et c le charactere recu)
  • typedef struct
  • {
  • int nb; // Nombre d'octets recus
  • char c; // Charactere recu
  • } Recv;
  • Sock connect(char* address, int port, Type type);
  • int send(Sock info, std::string mess, Type type);
  • Recv recv(Sock info, Type type);
  • int disconnect(Sock info, Type type);
  • #endif
  • /*-------------SOCKET.CPP-------------*/
  • // Socket library -*- C++ -*-
  • // Copyright (C) 2006 Christophe Tournayre
  • //
  • // This library is free software; you can redistribute it
  • // and/or modify it under the terms of the GNU General Public License
  • // as published by the Free Software Foundation; either version 2, or
  • // (at your option) any later version.
  • // This library is distributed in the hope that it will be useful,
  • // but WITHOUT ANY WARRANTY; without even the implied warranty of
  • // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  • // GNU General Public License for more details.
  • // As a special exception, you may use this file as part of a free software
  • // library without restriction. Specifically, if other files instantiate
  • // templates or use macros or inline functions from this file, or you compile
  • // this file and link it with other files to produce an executable, this
  • // file does not by itself cause the resulting executable to be covered by
  • // the GNU General Public License. This exception does not however
  • // invalidate any other reasons why the executable file might be covered by
  • // the GNU General Public License.
  • #include "socket.hpp"
  • using namespace std;
  • Sock connect(char* address, int port, Type type)
  • {
  • // ********************************************************
  • // Déclaration des variables
  • // ********************************************************
  • #if defined(WIN32)
  • WSADATA initialisation_win32; // Variable permettant de récupérer la structure d'information sur l'initialisation
  • #endif
  • Sock info;
  • int erreur=0, nb; // Variable permettant de récupérer la valeur de retour des fonctions utilisées
  • string buffer; // Tampon contenant les données a envoyer
  • #if defined(WIN32)
  • // ********************************************************
  • // Initialisation de Winsock
  • // ********************************************************
  • erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);
  • if (erreur!=0)
  • {
  • cerr << "Desole, je ne peux pas initialiser Winsock du a l'erreur : "<< erreur << " " << WSAGetLastError() << endl;
  • throw(1);
  • }
  • else
  • cout <<"WSAStartup : OK" << endl;
  • #endif
  • // ********************************************************
  • // Ouverture d'une Socket
  • // ********************************************************
  • if(type==Tcp)
  • info.id=socket(AF_INET,SOCK_STREAM,0);
  • else
  • info.id=socket(AF_INET,SOCK_DGRAM,0);
  • if (info.id==INVALID_SOCKET)
  • {
  • cerr << "Desole, je ne peux pas creer la socket du a l'erreur : " << WSAGetLastError() << endl;
  • throw(2);
  • }
  • else
  • cout << "socket : OK" << endl;
  • // ********************************************************
  • // Ouverture de la session
  • // ********************************************************
  • info.server.sin_family=AF_INET;
  • info.server.sin_addr.s_addr=inet_addr(address); // @ip serveur
  • info.server.sin_port=htons(port); // Port écouté du serveur
  • if(type==Tcp)
  • {
  • cout <<"connection en cours ";
  • erreur=connect(info.id,(struct sockaddr*)&info.server,sizeof(info.server));
  • if (erreur!=0)
  • {
  • cerr <<"Desole, je n'ai pas pu ouvrir la session TCP : " << erreur << " " << WSAGetLastError() << endl;
  • throw(3);
  • }
  • else
  • cout <<": OK" << endl;
  • }
  • return info;
  • }
  • int send(Sock info, string mess, Type type)
  • {
  • // ********************************************************
  • // Déclaration des variables
  • // ********************************************************
  • int nb;
  • // ********************************************************
  • // Envoi des données
  • // ********************************************************
  • if (mess.size()>65535)
  • {
  • cerr << "Message trop long!" << endl;
  • return -1;
  • }
  • if(type==Tcp)
  • nb=send(info.id,mess.c_str(),mess.size(),0);
  • else
  • nb=sendto(info.id,mess.c_str(),mess.size(),0,(struct sockaddr*)&info.server,sizeof(info.server));
  • if (nb==SOCKET_ERROR)
  • {
  • cerr << "Desole, je n'ai pas pu envoyer les donnees du a l'erreur : " << WSAGetLastError() << endl;
  • return -2;
  • }
  • else
  • {
  • cout << "Requete HTTP : OK" << endl;
  • return 0;
  • }
  • }
  • Recv recv(Sock info, Type type)
  • {
  • Recv ret;
  • if(type==Udp)
  • {
  • int temp=sizeof(info.server); // Passe par une variable afin d'utiliser un pointeur
  • ret.nb=recvfrom(info.id,&ret.c,1,0,(struct sockaddr*)&info.server,&temp);
  • }
  • else
  • ret.nb=recv(info.id,&ret.c,1,0);
  • return ret;
  • }
  • int disconnect(Sock info, Type type)
  • {
  • // ********************************************************
  • // Déclaration des variables
  • // ********************************************************
  • int erreur=0, ret=0;
  • if(type==Tcp)
  • {
  • // ********************************************************
  • // Fermeture de la session TCP Correspondant à la commande connect()
  • // ********************************************************
  • erreur=shutdown(info.id,2);
  • if (erreur!=0)
  • {
  • cerr << "Desole, je ne peux pas fermer la session TCP du a l'erreur : " << erreur << " " << WSAGetLastError() << endl;
  • ret = -1;
  • }
  • else
  • cerr << "shutdown : OK" << endl;
  • }
  • // ********************************************************
  • // Fermeture de la socket correspondant à la commande socket()
  • // ********************************************************
  • #if defined(WIN32)
  • erreur=closesocket(info.id);
  • #else
  • erreur=close(info.id);
  • #endif
  • if (erreur!=0)
  • {
  • cerr << "Desole, je ne peux pas liberer la socket du a l'erreur : " << erreur << " " << WSAGetLastError() << endl;
  • ret = -2;
  • }
  • else
  • cout << "closesocket : OK" << endl;
  • #if defined(WIN32)
  • // ********************************************************
  • // Quitte le winsock ouvert avec la commande WSAStartup
  • // ********************************************************
  • erreur=WSACleanup();
  • if (erreur!=0)
  • {
  • cerr << "Desole, je ne peux pas liberer winsock du a l'erreur : " << erreur << " " <<WSAGetLastError() << endl;
  • ret= -3;
  • }
  • else
  • cout << "WSACleanup : OK" << endl;
  • #endif
  • return ret;
  • }
  • /*--------------MAIN.CPP--------------*/
  • // Exemple d'utilisation de la bibliothèque
  • #include <string>
  • #include <iostream>
  • #include "socket.hpp"
  • using namespace std;
  • int main ()
  • {
  • Sock info;
  • Recv ret;
  • int i = 0, val = 1024;
  • string s, req("Donnees a envoyer");
  • try
  • {
  • info=connect("172.0.0.1", 6666, Tcp);
  • }
  • catch (int tmp) // Traitement de l'exception
  • {
  • cerr << "Erreur dans la connexion" << endl;
  • return tmp;
  • }
  • if(send(info, req, Tcp) !=0)
  • {
  • cerr << "Erreur lors de l'envoi de la requete : " << req << endl;
  • disconnect(info, Tcp);
  • return -4;
  • }
  • ret.nb=1;
  • while(ret.nb>0 && i<=val)
  • {
  • ret=recv(info,Tcp);
  • if (ret.nb==SOCKET_ERROR)
  • {
  • cerr << "ERREUR : Aucune données recue" << endl;
  • disconnect(info, Tcp);
  • retour= -2;
  • }
  • i++;
  • s+=ret.c
  • }
  • cout << "Message recu :" << s << endl;
  • if (disconnect(info, Tcp) != 0)
  • {
  • cerr << "Erreur lors de la deconnection !";
  • return -3;
  • }
  • return 0;
  • }
/*-------------SOCKET.HPP-------------*/
// Socket library -*- C++ -*-

// Copyright (C) 2006 Christophe Tournayre
//
// This library is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2, or
// (at your option) any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.


#ifndef __SOCKET_HPP__
#define __SOCKET_HPP__


// ********************************************************
// Les includes
// ********************************************************
#if defined(WIN32)
    #include <winsock2.h> // pour les fonctions socket
#else
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <linux/socket.h>
#endif

#include <string>
#include <iostream> //Pour cout, cin, cerr

// ********************************************************
// Déclaration des structures et ENUM
// ********************************************************

enum Type {Udp, Tcp};


// Structure pour l'inforamtion de la socket
typedef struct
{
    SOCKET id;          // Déclaration de l'identifiant e la socket
    SOCKADDR_IN server; // Déclaration de la structure des informations lié au serveur
} Sock;


// Structure pour la fonction Recv (nb contient le nb de charactere recus, et c le charactere recu)
typedef struct
{
    int nb;             // Nombre d'octets recus
    char c;           // Charactere recu
} Recv;


Sock connect(char* address, int port, Type type);
int send(Sock info, std::string mess, Type type);
Recv recv(Sock info, Type type);
int disconnect(Sock info, Type type);


#endif



/*-------------SOCKET.CPP-------------*/

// Socket library -*- C++ -*-

// Copyright (C) 2006 Christophe Tournayre
//
// This library is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2, or
// (at your option) any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// As a special exception, you may use this file as part of a free software
// library without restriction.  Specifically, if other files instantiate
// templates or use macros or inline functions from this file, or you compile
// this file and link it with other files to produce an executable, this
// file does not by itself cause the resulting executable to be covered by
// the GNU General Public License.  This exception does not however
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.

#include "socket.hpp"

using namespace std;

Sock connect(char* address, int port, Type type)
{
    // ********************************************************
    // Déclaration des variables
    // ********************************************************
    #if defined(WIN32)
        WSADATA initialisation_win32; // Variable permettant de récupérer la structure d'information sur l'initialisation
    #endif

    Sock info;
    int erreur=0, nb; // Variable permettant de récupérer la valeur de retour des fonctions utilisées
    string buffer; // Tampon contenant les données a envoyer

    #if defined(WIN32)
    // ********************************************************
    // Initialisation de Winsock
    // ********************************************************
    erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);

    if (erreur!=0)
    {
        cerr << "Desole, je ne peux pas initialiser Winsock du a l'erreur : "<< erreur << " " << WSAGetLastError() << endl;
        throw(1);
    }
    else
        cout <<"WSAStartup                    : OK" << endl;
    #endif

    // ********************************************************
    // Ouverture d'une Socket
    // ********************************************************
    if(type==Tcp)
        info.id=socket(AF_INET,SOCK_STREAM,0);

    else
        info.id=socket(AF_INET,SOCK_DGRAM,0);


    if (info.id==INVALID_SOCKET)
    {
        cerr << "Desole, je ne peux pas creer la socket du a l'erreur : " << WSAGetLastError() << endl;
        throw(2);
    }
    else
        cout << "socket                        : OK" << endl;

    // ********************************************************
    // Ouverture de la session
    // ********************************************************
    info.server.sin_family=AF_INET;
    info.server.sin_addr.s_addr=inet_addr(address); // @ip serveur
    info.server.sin_port=htons(port); // Port écouté du serveur

    if(type==Tcp)
    {
        cout <<"connection en cours           ";

        erreur=connect(info.id,(struct sockaddr*)&info.server,sizeof(info.server));

        if (erreur!=0)
        {
            cerr <<"Desole, je n'ai pas pu ouvrir la session TCP : " << erreur << " " << WSAGetLastError() << endl;
            throw(3);
        }
        else
            cout <<": OK" << endl;
    }

    return info;
}


int send(Sock info, string mess, Type type)
{
    // ********************************************************
    // Déclaration des variables
    // ********************************************************
    int nb;

    // ********************************************************
    // Envoi des données
    // ********************************************************
    if (mess.size()>65535)
    {
        cerr << "Message trop long!" << endl;
        return -1;
    }

    if(type==Tcp)
        nb=send(info.id,mess.c_str(),mess.size(),0);
    else
        nb=sendto(info.id,mess.c_str(),mess.size(),0,(struct sockaddr*)&info.server,sizeof(info.server));


    if (nb==SOCKET_ERROR)
    {
        cerr << "Desole, je n'ai pas pu envoyer les donnees du a l'erreur : " << WSAGetLastError() << endl;
        return -2;
    }
    else
    {
        cout << "Requete HTTP                  : OK" << endl;
        return 0;
    }
}


Recv recv(Sock info, Type type)
{
    Recv ret;

    if(type==Udp)
    {
        int temp=sizeof(info.server); // Passe par une variable afin d'utiliser un pointeur
        ret.nb=recvfrom(info.id,&ret.c,1,0,(struct sockaddr*)&info.server,&temp);
    }
    else
        ret.nb=recv(info.id,&ret.c,1,0);


    return ret;
}


int disconnect(Sock info, Type type)
{
    // ********************************************************
    // Déclaration des variables
    // ********************************************************
    int erreur=0, ret=0;

    if(type==Tcp)
    {
        // ********************************************************
        // Fermeture de la session TCP Correspondant à la commande connect()
        // ********************************************************
        erreur=shutdown(info.id,2);

        if (erreur!=0)
        {
            cerr << "Desole, je ne peux pas fermer la session TCP du a l'erreur : " << erreur << " " << WSAGetLastError() << endl;
            ret = -1;
        }
        else
            cerr << "shutdown                      : OK" << endl;
    }

    // ********************************************************
    // Fermeture de la socket correspondant à la commande socket()
    // ********************************************************
    #if defined(WIN32)
        erreur=closesocket(info.id);
    #else
        erreur=close(info.id);
    #endif

    if (erreur!=0)
    {
        cerr << "Desole, je ne peux pas liberer la socket du a l'erreur : " << erreur << " " << WSAGetLastError() << endl;
        ret = -2;
    }
    else
        cout << "closesocket                   : OK" << endl;


    #if defined(WIN32)
        // ********************************************************
        // Quitte le winsock ouvert avec la commande WSAStartup
        // ********************************************************
        erreur=WSACleanup();

        if (erreur!=0)
        {
            cerr << "Desole, je ne peux pas liberer winsock du a l'erreur : " << erreur << " " <<WSAGetLastError() << endl;
            ret= -3;
        }
        else
            cout << "WSACleanup                    : OK" << endl;
    #endif

    return ret;
}






/*--------------MAIN.CPP--------------*/

// Exemple d'utilisation de la bibliothèque

#include <string>
#include <iostream>
#include "socket.hpp"

using namespace std;

int main ()
{
    Sock info;
    Recv ret;
    int i = 0, val = 1024;
    string s, req("Donnees a envoyer");
    
    try
    {
        info=connect("172.0.0.1", 6666, Tcp);
    }   
        catch (int tmp)   // Traitement de l'exception
    {
        cerr << "Erreur dans la connexion" << endl;
        return tmp;
    }
    

    if(send(info, req, Tcp) !=0)
    {
        cerr << "Erreur lors de l'envoi de la requete : " << req << endl;
        disconnect(info, Tcp);
        return -4;
    }


    ret.nb=1;

    while(ret.nb>0 && i<=val)
    {
        ret=recv(info,Tcp);

        if (ret.nb==SOCKET_ERROR)
        {
            cerr << "ERREUR : Aucune données recue" << endl;
            disconnect(info, Tcp);
            retour= -2;
        }

        i++;
        s+=ret.c
    }
    
    cout << "Message recu :" << s << endl;

    if (disconnect(info, Tcp) != 0)
    {
        cerr << "Erreur lors de la deconnection !";
        return -3;
    }
    
    return 0;
}



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

24 avril 2006 10:26:52 :
;) J'ai enlever des cout que j'avais laissé pour des tests.
24 avril 2006 10:35:43 :
Ajout de --> "Sous windows ne pas oublier de linker avec "libwsock32.a" "
25 avril 2006 11:48:02 :
using namespace std; dans le .cpp au lieu du .hpp
25 avril 2006 14:30:43 :
Remplacement du #define par un enum pour pouvoir utiliser Tcp et Udp en meme temps !
25 avril 2006 14:44:10 :
Ajout du fichier "main.cpp" montrant une utilisation de la bibliothèque.

 Sources du même auteur

Source avec Zip FAST BASE64 / UUENCODING ENCODAGE/DECODAGE
Source avec Zip LIBCONNECT - BIBLIOTHÈQUE C++ DE CONNEXION
CONVERTIR UNE STRING EN N'IMPORTE QUOI
UNE LISTE DOUBLEMENT CHAINEE, CIRCULAIRE ET TEMPLATES
Source avec Zip UN JUKEBOX POUR LINUX

 Sources de la même categorie

Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta
PROXY IRC SIMPLE (WINDOWS/WINSOCK) par _michel

 Sources en rapport avec celle ci

Source avec Zip LIBCONNECT - BIBLIOTHÈQUE C++ DE CONNEXION par turnerom
Source avec Zip MINI CHAT CLIENT-SERVEUR (UDP) AVEC TRANSFERT DE FCIHIER (TC... par CAVAVIN128
Source avec Zip CLASSE WINSOCK POUR NEWBIE par jean84
Source avec Zip FAIRE PASSER LE PARTAGE DE CONNEXION A SERTAIN SERVEUR (TCP ... par petitchech
Source avec Zip TUTORIAL : LES SOCKETS SOUS WIN (TCP & UDP) par vbnul

Commentaires et avis

Commentaire de anonyme_man_in_this_world le 24/04/2006 22:34:38

ça a l'air d'etre pas mal cepandant pourquoi tu le

classifie parmi des codes C++ et non pas C .

Commentaire de Kirua le 25/04/2006 11:33:03

à cause de ceci:

using namespace std;

qui d'ailleurs ne devrait jamais apparaître dans un en-tête (.h , .hpp, .hh)

c'est assez important, puisque ts les programmes qui inclueront ta lib verront le namespace std automatiquement (et pas forcément consciemment) mis dans le namespace global (façon de parler).

sinon, vrmnt intéressant d'avoir codé ça, ce serait bien que tu fasses une version encapsulée (classes) et que tu vire l'usage des #define TCP et UDP, puisque, j'imagine, on peut avoir besoin des deux à la fois ds un programme, non? c'est dommage de se limiter si ta lib gère les deux :)

Commentaire de turnerom le 25/04/2006 11:52:48

|pourquoi tu le classifie parmi des codes C++ et non pas C
--> Voir reponse de Kirua ;D


| using namespace std;
| qui d'ailleurs ne devrait jamais apparaître dans un en-tête (.h , .hpp, .hh)
| c'est assez important, puisque ts les programmes qui inclueront ta lib verront le namespace std
| automatiquement (et pas forcément consciemment) mis dans le namespace global (façon de parler).
--> En effet, merci c'est corrigé.

| ce serait bien que tu fasses une version encapsulée (classes)
--> J'y travaille

| vire l'usage des #define TCP et UDP, puisque, j'imagine, on peut avoir besoin des deux à la
| fois ds un programme, non? c'est dommage de se limiter si ta lib gère les deux :)
--> Oui pourquoi pas, je vais voir ca !

Commentaire de Kirua le 25/04/2006 11:58:58

Que de dynamisme, ça fait plaisir :D J'attends la suite ^_^.

Commentaire de turnerom le 25/04/2006 14:45:46

| vire l'usage des #define TCP et UDP, puisque, j'imagine, on peut avoir besoin des deux à la
| fois ds un programme, non? c'est dommage de se limiter si ta lib gère les deux :)
| --> Oui pourquoi pas, je vais voir ca !
----> C'est fait.

Commentaire de krust le 25/04/2006 15:41:30

Ok, je vois ce que tu veux dire par transparent maintenant. C'est juste pour éviter un reverse engineering trop aisé.

Commentaire de anonyme_man_in_this_world le 26/04/2006 17:52:27

"using namespace std;"

oui mais est ce vraiment obligatoire ?

je vois que le code peut etre aisement convertit en C ainsi il

sera utilisé en C/C++ .

Commentaire de turnerom le 26/04/2006 18:37:16

Oui en effet, j'utilise les string plutot que des char* pour plus de facilité, quant aux cout et cerr on peut aisément les remplacer par des printf(...) et fprintf(stderr, ...). Par contre les exceptions ne pourrons plus être utilisées.
Je travaille actuellement sur une version purement C++ orientée objets (du C++ quoi ;D), qui sera je pense, très puissante et simple à utiliser avec la possibilité de rajouter des protocoles autres que TCP et UDP facilement.
Je la posterai quand je l'aurai terminé.

w&s

Commentaire de dPompei2 le 29/04/2006 13:44:14

c'est pas mal, mais tu disais que tu l'a faite par "besoin", alors juste une question: pourquoi t'avait pas utilisé la SDL_net ?
sinon, elle a l'air bien ta lib ;)

Commentaire de crunch117 le 07/10/2006 11:40:49

Les + :

- Commentaires présent, ce qui est énorme ;)

je trouve cette source très basique et mal conçue pour plusieurs raisons :

Les - :

- c'est un joyeux mélange de C et de C++ avec des char * et std::string dans tous les sens
- aucune encapsulation véritable des fonctions de communication, qui risquent plus de compliquer les librairies socket plutot que de les simplifiées
- il y a quelque chose (qui n'est pas très grave mais qui est souvent récurrent), c'est aussi un mixage de deux langages : français / anglais. Par exemple on a à plusieurs endroits des variables "temp" et plus loin "erreur"  puis ensuite "tmp", "ret" puis "retour", autant dire que si tu veux présenter ta source à un étranger, il va perdre un temps fou à apprendre l'anglais s'il ne connait pas et ensuite le français, qui est bien plus compliqueé en comparaison des langages de programmation.
- WSAGetLastError() n'est, je crois non portable.
- La gestion d'erreurs est désastreuse : joyeux mélange de throw (int), avec aucune spécification , avec des codes de retours de fonctions non définies en constantes entre les fonctions et ses utilisateurs mais c'est parceque tu n'as pas fait de choix clairs.
- "using namespace" est en effet assez dangereux, utilise des alias (using std::(object,class)), l'espace de nom global, surtout en C++, ne doit pas être polluer à cause de fichiers en-têtes

Si tu veux améliorer ta source, et son but, tu devrais (toujours selon moi) :

- Choisir entre C et C++, programmation structurale et programmation objet.
- Choisir le langage dans lequel tu veux présenter tes sources et AUSSI les commentaires
- Réaliser un minimum de conception
- Utiliser un maximum des constantes
- Encapsuler les fonctions dans une classe avec une interface protégée
- Définir l'interface de chaque fonction

Je ne m'adresse pas seulement à toi mais à tous les débutants en C/C++ car ils n'ont pas choisi des langages de trop haut niveau, et que si ils veulent faire quelque chose de propre, ils devraient prendre de bonnes habitudes.

Si des gens ont d'autres suggestions...

Commentaire de turnerom le 08/10/2006 20:28:02

Oui, en effet, cette source n'est pas de toute première jeunesse. J'ai tout refait en C++ de manière bien plus otimisé.
Je la posterai bientot.

Commentaire de lepiratox le 24/02/2007 21:57:09

merciiii

Commentaire de wadcyr8_197 le 15/06/2007 16:13:04

salut,

merci pour cette petite bibliothèque qui me simplifie bien la vie.

par contre j'ai lu que tu l'avais refaite en C++ pur et que tu devais la poster. Malheureusement je n'arrive pas à mettre la main dessus, l'as tu fait finalement ?

merci
Wad

Commentaire de turnerom le 15/06/2007 17:32:10

oui, je suis en train de corriger les derniers bugs. Je vais essayer de la poster avant la fin du mois.

Commentaire de wadcyr8_197 le 15/06/2007 18:02:01

ok, cool, merci bien !

juste une question, j'ai vu que tu gérais le recv() en caractère par caractère ? Mes connaissances en C++ sont toutes neuves, mais n'y a-t-il pas possibilité de gérer ça avec un string pour qu'il reçoivent un message complet directement ?

Commentaire de turnerom le 15/06/2007 18:16:15

Si si bien sur, la nouvelle version le fait !
Cette version est une biblio que j'avais dans le cadre d'un TP, il y'a de cela bien longtemps maintenant (j'en était à mes début de prog :D). La future version est de tout bien de vue bien meilleure.

Commentaire de wadcyr8_197 le 15/06/2007 18:26:11

ok, parfait, j'ai hate quelle sorte, je vais commencer à m'en servir dans le cadre de mon stage pour de la communication telnet avec un lecteur RFID :d

Commentaire de wadcyr8_197 le 19/06/2007 08:35:16

Autre petite question, est ce que la nouvelle version sur laquelle tu bosses prend en charge les sockets côté serveur. je pense notamment aux fonctions bind et listen parce que ça n'est pas le cas sur celle-ci et je m'arrache un peu les cheveux pour l'aspect transparent unix/windows vu que je ne connais pas le fonctionnement sous windows !

Commentaire de turnerom le 19/06/2007 10:01:12

oui

Commentaire de wadcyr8_197 le 03/07/2007 16:38:21

Salut !

je te relance, au risque d'être un peu lourd, pour savoir où tu en étais de tes modifications ? Parce que j'ai adapté celui que j'ai récupéré à mon utilisation, mais disons que c'est pas très propre et pas très C++ :D

Commentaire de wadcyr8_197 le 11/07/2007 09:45:38

toujours pas de nouvelles ?

Commentaire de turnerom le 16/07/2007 11:42:53

Voila la nouvelle mouture :
http://www.cppfrance.com/code.aspx?ID=43473

Commentaire de wadcyr8_197 le 18/07/2007 09:24:59

merci je vais voir ça !

 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 Erreur 10049 sur socket UDP [ par Ezekiel69 ] Salut tous le monde...Me voici depuis plusieurs jour confronté un a problème étrange.Je veux envoyer un message par l'intermédiaire d'un packet UDP su Proxy TCP (rediriger une connexion TCP) [ par MetalDwarf ] Je suis en train de programmer un petit prog avec une couche reseau assez importante et j aimerais y integrer un proxy capable de rediriger toute conn 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 EVENEMENTS WINSOCK [ par DeAtHCrAsH ] Quelqu'un aurait il une liste detaillé des differents evenements mis en place pour mes socket ? (WM_SOCKET)Et sans MFC ou VCL !Du genre l'evenement qu Problème de socket UDP sous linux [ par RaygKross ] Salut à tousMon problème est je dois créer un programme manager snmpLes port de SNMP sont 161 et 162J'initialise ma structure de type sockaddr_in avec Winsock simple... [ par DeAtHCrAsH ] Comment faire pour que le serveur puisse gerer plusieurs client a la fois ?Dois-je declarer autant de socket qu'il y a de client ?Ou y a t'il un equiv pb socket [ par surfeurnet ] voici mon programme qui a pour l'instant pour unique but de se connecter à un serveur :# include &lt;stdio.h&gt;# include &lt;winsock2.h&gt;# pragma c Raw Socket -> TCP/IP [ par krum ] Voila plus d'une semaine que je fouille/cherche sur les moteurs de recherches,les forums ..des sources,des tutos,des papers sur les raw sockets (sous recvfrom + udp + '\n' [ par vegetaline ] salutune appli client / serveur sous linux qui communique (enfin qui essaye) avec des sockets INTERNET en mode NON CONNECTE (en udp :)pb -&gt; le recv


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales