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();
}