problème de socket client --> bloquantes ou pas - C++ - Programmation
Marsh Posté le 15-01-2004 à 16:22:45
apparement si le buffer de recv est vide, c'est que ton socket n'est pas bloquant ou que la connexion a été coupée.
sinon, pour attendre l'arrivée de données, tu peux jouer avec select() de l'api socket
Marsh Posté le 15-01-2004 à 17:30:34
donne un bout de code pour voir ? du moment ou tu crée ton socket jusqu'au recv qui foire ?
Marsh Posté le 15-01-2004 à 17:31:48
ben c pas bloquant par defaut ? comment se fesse que tu sois en non-bloquant ?
Marsh Posté le 15-01-2004 à 18:25:54
Je t'invite à faire afficher la valeur retournée par recv() lorsque ce dernier se "débloque" sans retourner un seul octet de données.
En effet, recv() retourne 0 lorsque la connexion a été interrompue correctement independament de ta volonté. recv() retourne -1 (SOCKET_ERROR) lorsque la connexion a été interrompue de manière inatendue (genre "connection reset by peer" ).
Perso, j'ai un soucis du même genre avec un retour d'erreur égale à 183 (ca ne semble meme pas etre une erreur de type socket mais une erreur plus générale)... cela dit pas d'etonnement dans tous les cas, il y a visiblement bcp de raison pour qu'une connexion TCP se déconnecte toute seule !
Cordialement,
Xter.
Marsh Posté le 17-01-2004 à 15:12:22
voilà.
création socket
Code :
|
le problèmest est que parfois le buffer n'est pas plein. Donc la boucle s'arrête est le message est tronqué
Je précise que j'utilise ceci pour récupérer un mail sur un serveur POP.
Marsh Posté le 17-01-2004 à 15:15:42
Je comprends pas le problèmes, Sous linux sans ces WSA ça fonctionne très bien. Mais l'adaptation sous Windows est plus difficile que je pensais.
Marsh Posté le 20-01-2004 à 21:10:31
Franchement, il n'a vraiment pas l'air assez robuste ton code, vis a vis des exceptions (ie.: en cas d'erreur de retour de l'appel recv() en particulier).
Courage,
Xter.
Marsh Posté le 20-01-2004 à 21:15:32
lol. j'ai bien remarqué merci. Mais avant de gérer les exceptions, j'aimerai bien que ça fonctionne dans une utilisation normale...
Sinon, t'as pas une idée ?
Marsh Posté le 21-01-2004 à 12:35:43
Remplace
Code :
|
par
Code :
|
Et compile ton code en definissant ton preprocesseur DEBUG et ajoute un max de messages pour superviser l'etat des variables. Puis post les messages de debug ici.
Cordialement,
Xter.
Marsh Posté le 21-01-2004 à 13:05:48
je ne peux pas faire errcode > 0. Car comme les sockets étant bloquantes, un recv de trop me bloque l'application (qui attend...)
Merci pour ton aide en tout cas
Marsh Posté le 21-01-2004 à 23:26:12
Pffff... tu as essayé au moins ?
Marsh Posté le 21-01-2004 à 23:40:19
Oui merci j'ai essayé bien avant de poster sur ce forum...
Marsh Posté le 22-01-2004 à 20:32:58
Tu devrais adopter une gestion de socket plus avancée avec un appel selec() avant recv() et close().
Cordialement,
Xter.
Marsh Posté le 23-01-2004 à 15:21:40
dans quel but ? le problème vient-il de là ?
Excuse-moi mais gestion de socket plus avancée techniquement ça m'aide pas beaucoup...
Marsh Posté le 23-01-2004 à 18:00:25
un petit exemple :
Code :
|
c'est un peu codé "à la gros porc" c'est juste pour te donner une idée : le but ici est d'attendre et de recevoir jusqu'à ce que le serveur n'envoit plus rien pendant le temps 'timeout'.
Marsh Posté le 15-01-2004 à 16:20:14
Hello,
Voici le problème.
Je travaille sur un client socket pour POP. Lorsque je send le message (par exemple "USER jagstang" )
je récupère tout de suite après la réponse avec recv()
Il arrive que le serveur ne soit pas assez prompt pour la réponse, et le buffer est vide...
J'ai pas trop l'envie de mettre des sleep ou autres...
J'ai lu pas mal de trucs à ce sujet, notamment l'utilisation de socket bloquantes / non bloquantes, ainsi que de faire un thread pour chaque envoi/réponse
Quelqu'un a-t-il une idée ?
Merci