Client serveur TCP, pb multi Thread

cs_valoue Messages postés 72 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 13 mai 2011 - 21 juin 2004 à 15:28
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 23 juin 2004 à 01:35
Bonjour,

Voilà, je suis en train de développer un client serveur en C++ (sous VC++ .net).
Pour le moment, j'ai créé le serveur et le client, ils marchent.
Cependant, lorsque j'ai voulu lancer un scenario, pb !!
Je lance le serveur
Je lance le client
Le client envoie un msge au serveur
Le serveur doit repondre au client
Le serveur repond (send se passe bien)
Le client doit alors recevoir, mais pb sur le recv (erreur 10054).
Apparement, c'est un pb de synchronisation. Le recv est bloquant et le pb serait dû a ça !

Pour le moment les sockets que j'utilise sont des "int", et pour les créer je fais
s = socket (.....).

Auriez vous une solutions a mon pb svp ?
merci d'avance

Valoue

2 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 1
21 juin 2004 à 18:17
salut,

Fait une recherche sur la fonction WSAAsyncSelect

@++
0
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
23 juin 2004 à 01:35
Pour commencer un socket c'est pas un int mais un unsigned int sous Windows

Ensuite, tu peux mettre ton socket non bloquant si tu le veux avec la petite fonction ioctlsocket()

unsigned long dwNoBlock = 1;
ioctlsocket( nSocket, FIONBIO, &dwNoBlock );
/*
renvoie SOCKET_ERROR(-1) en cas de problème
*/

ensuite, c'est pas un problème de synchronisation mais seulement que la connexion à été fermé

10054 = WSAECONNRESET

Vérifie auprès de ton serveur pour voir si ce n'est pas lui qui ferme la connexion car il y à perte de connexion la

Si tu utilise socket()/recv()/etc ... utilise select() dans ton serveur, tu peux aussi l'utiliser dans ton client

et avoir des sockets qui bloque, ce n'est pas la fin du monde:

int nResult = -1;
int nError = 0;

nResult = recv( nSocket, Buffer, BufSize, 0 );
if ( nResult > 0 ) {
/* c'est okay */
puts(Buffer);
putchar('\n');
}
else if ( nResult == 0 ) {
/* connexion fermée 'proprement' */
}
else {
/* problème */
nError = WSAGetLastError();
if ( WSAEWOULDBLOCK != nError ) {
return nError;
}
else {
/* débloque ton socket */
}
}

Ton problème est une perte de connexion tout simplement.

~(.:: NitRic ::.)~
0