Historique des modifications - Message

Message #5440

Sujet: Lib reseau


Type Date Auteur Contenu
Création du message 05-01-2009 01:33:36 yamashi
Pour répondre a tmyke car il est quand même l'auteur du topic voici un code que tu pourrais modifier pour adapter a tes besoins :

#if defined (WIN32)
#include <winsock2.h>
#define socklen_t int
#elif defined (linux)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close (s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#endif
#include <iostream>
#include <list>
#include <pthread.h>

typedef std::list<SOCKET> sockvec;
sockvec m_vec;
fd_set readfs;
struct timeval  timeout;
SOCKET sock;
SOCKADDR_IN     sin;
socklen_t       recsize;

using namespace std;

int run()
{
    SOCKET NewConnection;
    int code = select (FD_SETSIZE, &readfs, NULL, NULL, &timeout);
    switch(code)
    {
        case 0:
        break;
        case -1:
        break;
        default:
        if (FD_ISSET (sock, &readfs))
        {
            if((NewConnection = accept (sock, (SOCKADDR *) &sin,&recsize)) == INVALID_SOCKET)
            {
                closesocket( sock );
                return 1;
            }
            m_vec.push_back(NewConnection);
            cout << "Nouveau client, IP : " << inet_ntoa (sin.sin_addr);
        }
        else
        {
            for (sockvec::iterator It = m_vec.begin() ; It != m_vec.end() ; It++)
            {
                if(FD_ISSET(*It,&readfs))
                {
                    char buffer[1500];
                    int n = recv(*It,buffer,sizeof buffer - 1,0);
                    cout << "Nous avons recu : " << n << " octets" << endl;
                    cout << "Buffer : " << buffer << endl;
                    if(n == SOCKET_ERROR)
                        m_vec.erase(It);
                }
            }
        }
        break;
    }

}

void initFD()
{
    FD_ZERO (&readfs);
    FD_SET (sock, &readfs);
    for (sockvec::iterator It = m_vec.begin() ; It != m_vec.end() ; It++)
    {
        FD_SET (*It, &readfs);
    }
}

int main()
{
    #if defined (WIN32)
        WSADATA WSAData;
        int error = WSAStartup(MAKEWORD(2,0), &WSAData);
    #else
        int error = 0;
    #endif
    recsize = (int) sizeof sin;
    int sock_err;
    timeout.tv_sec = 0;
    timeout.tv_usec = 50;
    int port;
    cout << "Port a ecouter : ";
    cin >> port;
    if(!error)
    {
        /*********************************************************/
        /***                    TCP                             **/
        /*********************************************************/

        sock = socket (AF_INET, SOCK_STREAM, 0);

        if (sock != INVALID_SOCKET)
        {
            // Set the protocol, port, and address information.
            sin.sin_addr.s_addr = htonl (INADDR_ANY);
            sin.sin_family = AF_INET;
            sin.sin_port = htons (port);

            // Bind the socket.
           int sock_err = bind (sock, reinterpret_cast<sockaddr *>(&sin), recsize);

           cout << "TCP socket ouvert a l'écoute de : " << port << endl;

            if (sock_err != SOCKET_ERROR)
            {
                sock_err = listen (sock, 5);

                while(1)
                {
                    initFD();
                    run();
                }


            }
            closesocket(sock);

        }
        #if defined (WIN32)
            WSACleanup();
        #endif
    }
    return 0;
}

Ce code accepte des connections TCP (autant que tu veux) et affiche le paquet recu ainsi que sa taille jusqu'a ce que le client se déconnecte.
Je n'ai pas gérer le paquet stacking.
Ce code n'est pas très propre...
Donc a toi d'en faire une classe ou de gérer comme bon te semble.
Pour ce qui est d'un client :

#if defined (WIN32)
#include <winsock2.h>
#define socklen_t int
#elif defined (linux)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close (s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#endif
#include <iostream>


void main()
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
SOCKET sock;
SOCKADDR_IN sin;
char *buffer = new char[255];
char ip[20];
int port;
cout << "IP du serveur : ";
cin >> ip;
cout << "Port du serveur : ";
cin >> port;
/* Tout est configuré pour se connecter sur IRC, haarlem, Undernet. */
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr			= inet_addr(ip);
sin.sin_family				= AF_INET;
sin.sin_port				= htons(port);
connect(sock, (SOCKADDR *)&sin, sizeof(sin));
while(1)
{
char buffer[1500];
cin >> buffer;
send(sock,packet,sizeof packet + 1, 0 );
//recv(sock, buffer, sizeof(buffer), 0); <- fonction si tu veux recevoir
}
closesocket(sock);
WSACleanup();
}

Retour

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
190 invités en ligne
membre en ligne: -
RSS Feed