Un peu d'aide pour un serveur

NAVIE Messages postés 23 Date d'inscription samedi 1 janvier 2005 Statut Membre Dernière intervention 23 avril 2006 - 27 févr. 2005 à 20:47
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 27 févr. 2005 à 21:53
Bonjour, voilà mon souci: a l'aide de mon compilateur Dev-C++ Version 4.9.8.10 j'ai crée un socket qui sert de serveur. Cependant même si la compilation a été bonne, mon programme n'arrive pas à mettre en place le serveur. J'ai d'abord désactivé mon firewall mais cela a donné quand même le même résultat. Je me suis dit alors que peut-être cela vient de mon code; le voici:

#include
#include <winsock2.h>#include <conio.h><?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />


using namespace std;


int main(int argc, char *argv[])
{


WSADATA WSAData;
if((WSAStartup(0x0202, &WSAData))!=0)
{
cout<<"[-]WSAStartup Erreur:\n\a"<<WSAGetLastError()<<endl;
getch();
return -1;
}
cout<<"[+]WSAStartup réussi"<<endl;


SOCKET W_IP;
if((W_IP = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))==-1)
{
cout<<"[-]Erreur: Résolution de créer le socket.\n\a"<<endl;
getch();
return -1;
}
cout<<"[+]Création du socket réussie."<<endl;
struct sockaddr_in server;
struct sockaddr_in client;
int sock_serv, sock_client;

server.sin_family=AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(6667);

int sizeserv=sizeof(server);


if ((bind(sock_serv,(struct sockaddr*)&server, sizeserv))==-1)
{
cout<<"[-]Impossible de lancer le serveur.\n\a"<<endl;
getch();
return -1;
}

char Buffer[]="Hello you!\r\n";
listen(sock_serv,0);


while(1)
{

int sizecli=sizeof(client);
if ((sock_serv=accept(sock_serv,(struct sockaddr*)&client,&sizecli))==-1)
{
cout<<"[-]Erreur: Impossible d'accepter le visiteur.\n\a"<<endl;
}
send(sock_client, Buffer, strlen(Buffer), 0);
cout<<"[+]Une personne vient de se connecter."<<endl;
}
return 0;
}

Merci à quiqonque voudra m'aider.

NAVI

1 réponse

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
27 févr. 2005 à 21:53
Premièrement, si ton WSAStartup() échoue, WSAGetLastError() n'est pas disponible:

int ret;
WSADATA wdata;

/*
WSAStartup() renvoie 0 si succès sinon, le code d'erreur
*/
if ( (ret = WSAStartup( WINSOCK_VERSION, &wdata )) )
{
cout << "error => " << ret << endl;
return 0;
}

/* notre version n'est pas disponible, pour éviter tout problème, on quitte */
if ( LOBYTE(WINSOCK_VERSION) != LOBYTE(wdata.wVersion) )
{
cout << "error => " << WSAVERNOTSUPPORTED << endl;
WSACleanup();
return 0;
}

/* faut pas oublier de lier la librairire aussi, sous Dev-C++ son nom est `libws2_32.a` je crois */

ensuite, pour créer un socket de type SOCK_STREAM(tcp/ip):
SOCKET ton_serveur = socket( AF_INET, SOCK_STREAM, IPPROTO_IP );

/* IPPROTO_IP peut être remplacé par 0 tout simplement */

dans ton code, W_IP est ton socket serveur, c'est sur ce dernier que tu dois appliquer le bind() et le listen().

lorsque tu assigne une adresse à la struct `sockaddr_in`, utilise htonl()
TonSockAddrIn.sin_addr.S_un.S_addr = htonl( INADDR_ANY );

pour rendre la chose encore plus `propre`, met le membre .sin_zero à zéro
memset( TonSockAddrIn.sin.zero, 0, sizeof(TonSockAddrIn.sin.zero) );

par la suite, absolument aucune connexion ne pourat être acceptée par ton serveur, ton listen() est à zéro => ne rien accepter

if ( SOCKET_ERROR != listen( W_IP, 5 ) )
cout << "GOOD!" << endl;

tu as maintenant une queue de 5 connexions simultanées.
tu as aussi la macro SOMAXCONN qui est définie dans winsock2.h

/* exemple: */
listen( W_IP, SOMAXCONN );

tu devrais regarder du coté de la fonction select(), elle te sera très utile.

lorsque tu accept une nouvelle connexion, utilise un autre socket:
sock_client = accept( W_IP, (struct sockaddr *)&client, sizeof(struct sockaddr_in) );

Pour information, sous Windows, le type SOCKET est un entier non signé.
typedef unsigned int SOCKET;

contrairement sous Linux ou c'est un entier signé, alors utilise soit: unsigned int ou SOCKET.

SOCKET ton_socket;
unsigned int ton_socket;

etc ... etc ... etc ...

Voilà un bon site sur Winsock => http://tangentsoft.net/wskfaq/
Un autre => http://www.sockets.com
Et un autre => http://www.ecst.csuchico.edu/~beej/guide/net/
Un incontournable sous Windows => http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/winsock_reference.asp

Il y à des exemples sut tout ces sites, faqs, etc ...

~(.:: NitRic ::.)~
0
Rejoignez-nous