Socket api

[Résolu]
Signaler
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007
-
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007
-
Salut,
Je m'esseye aux socket non bloquante en api win32 mais je bloque sur un point.
Pour mon serveur, mon WSAAsyncSelect fonctionne mais pour le client il y a quelque chose que je n'ai pas compris :
Entre le socket() et le connect() je fais ça :
WSAAsyncSelect(sock_client, hwnd, WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_READ | FD_WRITE);
Si je le commente, mon connect() deviens bloquant mais se connecte impecablement au serveur.
Le truc c'est que j'aimerais passer par du non_bloquant pour gerer les FD_READ, FD_WRITE et FD_CLOSE sans passer par du thread.
Mais lorsque je décommente le WSAAsyncSelect, le connect() ne fonctionne plus. J'ai lu quelquepart que c'est parce qu'il n'as pas le temps de se connecter. J'ai alors esseyé de le mettre dans un while(!OK) avec FD_CONNECT: OK = 1 ; mais il ne se connecte toujours pas.
Que faire pour que mon connect() fonctionne ?
merci

5 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Avec le WSAAsyncSelect(), connect() va échouer avec l'erreur
WSAEWOULDBLOCK (ce qui est normal puisqu'il est bloquant), et lorsque
la connection sera établie, tu recevra l'event FD_CONNECT.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Lorsque connect retourne SOCKET_ERROR il faut appeler
WSAGetLastError(), et si WSAGetLastError() != WSAEWOULDBLOCK,
alors tu es sur qu'il y a une vrai erreur.

Ensuite, le FD_CONNECT est toujours envoyé, et pour savoir si
l'operation a reussi ou pas, il faut regarder le numéro de l'erreur qui
se trouve dans HIWORD(lParam) a la reception du message.
Messages postés
161
Date d'inscription
samedi 25 juin 2005
Statut
Membre
Dernière intervention
1 août 2006

salut,

essaie de te connecter puis rend ta socket non-bloquante avec WSAAsyncSelect().
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007

Ah ok !!! Je ne m'attendais pas à ce que cette erreur soit normale et j'avais un exit(-1) dans mon traitement d'erreur de la connect() alors forcément :D
C'est bizare comme truc, ils auraient pu retourner une socket speciale qui voudrais dire que le connect() a fonctionné mais qu'il est non bloquant du genre 65535 parceque la on a l'impression que le connect a échoué.
Merci !!

Bon maintenant par contre il m'envois FD_CONNECT meme quand y'a pas de serveur mais j'ai pas encore cherché... je verrai ça lundi !
Messages postés
111
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
17 octobre 2007

J'ai tout compris merci à toi :)