begin process at 2012 05 28 17:34:15
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

lundi 25 juillet 2005 à 21:26:04 | Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

billbaxter

Bonjour,

J'ai développé une appli client-serveur avec les winsock2 en me référant aux exemples MSDN, donc à priori dans les règles de l'art.
Le client pose une question ("send").
Le serveur en attente ("recv") reçoit, traite la question et renvoie ("send") sa réponse de dimension variable.
Le client qui s'était mis en attente ("recv") reçoit sa réponse et l'intègre, etc...

Je suis tombé par hasard sur la cas particulier suivant : lorsqu'au gré des questions-réponses le serveur retourne une réponse d'EXACTEMENT 1418 octets, càd que le send a pour paramètre une taille à envoyer de 1418 octets, le recv() du client reste bloqué.
Pour tout envoi de dimension différente (inf ou sup) ça marche. Mon buffer est bien (sur)dimensionné. Pas de débordement.

Du côté client, pour varier le morcellement, j'ai essayé de modifier la taille mentionnée dans le recv(), en petit (1024), en moyen (4096), et en grand... Rien n'y fait.
J'ai essayé en bloquant, non bloquant. J'ai utilisé ioctlsocket avec SO_LINGER pour m'assurer que le flush était correct. C'est vraiment cette dimension qui a l'air de poser pb.
Ca me fait penser à cette erreur algorithmique classique de découpage d'un bloc de dimension N qui est un multiple entier de blocs élémentaires n, et où il faut bien penser au "+1" : nbblocs = N / n ; si (N mod n != 0) alors nbblocs += 1
Est-ce que 1418 ne correspondrait pas à une dimension particulière (liée à la Freebox par exemple) ?

Précisons que je rencontre ce pb entre 2 freebox, je n'ai pas essayé dans un autre contexte matériel (routeur, FAI différents).

Merci pour votre aide.

mardi 26 juillet 2005 à 00:00:47 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

cosmobob

salut,
il faut que tu postes ton code ici si tu veux être aidé.
je coupe court a tes questions philosophiques sur la taille du buffer; il y a 99% de chance que ton pb vienne d'un bogue (les 1% restant étant un pb de configuration de ton reseau).
oublie le nombre 1418 ... qu'aurais tu pensé si ca avait été 666 ?

copie colle le code du client et du serveur !!

a+

mardi 26 juillet 2005 à 00:15:51 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

cosmobob

poste un code que d'autres personnes puisse compiler, pour voir si ton pb est reproductible ...
mardi 26 juillet 2005 à 16:26:38 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

billbaxter

ok, mon code est déposé.
2 projets visual studio : le serveur TstSockS et le client TstSockC.
Dérivé d'un projet existant pour mettre en évidence mon problème.
@+
En attendant je vais essayer avec d'autres config matérielles.
mardi 26 juillet 2005 à 21:26:48 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

billbaxter

Pour info,

1) j'ai bien cru lire quelque part que 1418 est la longueur des buffers internes de TCP/IP gérée par les routeurs... Ce ne serait donc pas une valeur comme une autre.

2) j'ai fait un test entre chez moi (avec "tstsockc") et le serveur (avec "tstsocks") - cf mon code source déposé -, les 2 en freebox dernière version, et ça marche.
Je n'ai donc détecté ce problème qu'entre ma machine du boulot et le serveur en question. Je testerai demain entre ma machine du boulot et un autre serveur, mais à priori ça plantera aussi car c'est sur  cet autre serveur que j'avais détecté initialement le problème. Ce qui reviendrait à dire qu'il y a un problème depuis ma freebox "boulot" (pb de routage ?...).

A confirmer.
mercredi 27 juillet 2005 à 10:23:56 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

cosmobob

mais quand ca marche pas quel est ton problème ?????
le send te renvoie SOCKET_ERROR ?!? ou tout se passe correctement mais rien n'arrive?

mercredi 27 juillet 2005 à 10:27:00 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

cosmobob

ps: ton code est cela dit mal structuré et surtout super mal indenté, ce qui le rend difficilement lisible !!
mercredi 27 juillet 2005 à 14:26:41 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

billbaxter

Quand ça ne marche pas le problème est le suivant : le send du serveur se fait correctement mais le recv du client reste bloqué jusqu'à retourner un WSAECONNRESET.

J'ai mis à jour le code avec une indentation correcte sur les CPP. Ceci dit, je ne vois pas en quoi il est mal structuré, une fois cette correction faite (remplacement des tabulations par 2 espaces)...

Sinon, A CE JOUR, mon problème ne se produit (systématiquement et de façon reproductible) que depuis mon poste de développement à mon boulot (freebox V1 connectée en USB) vers deux serveurs particuliers dotés d'une freebox dernière génération.
Depuis mon poste, mis à part ce problème tout le reste marche nickel (Internet, applications réseau, etc...)
A+
mercredi 27 juillet 2005 à 15:34:05 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

cosmobob

salut,
essaie de virer ton globalLock, dans ton exemple ta série de questions se fait dans le meme thread.

mercredi 27 juillet 2005 à 16:51:02 | Re : Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox

billbaxter

Je pourrais effectivement optimiser le code en faisant dans le client :
1) cBytesRead = recv (ServerSock, lpBufCour, 8192 - dimLus, 0) ;
2) n'appeler qu'une fois le WSAStartup
3) Locker et Unlocker en dehors de la boucle Question (i)
Mais bon, le noeud du pb n'est pas là me semble-t'il.
A+



Cette discussion est classée dans : send, dimension, client, octets, recv


Répondre à ce message

Sujets en rapport avec ce message

Fonctions send et recv [ par bubbless ] Bonjour, Dans le cadre d'un projet, je réalise actuellement un système serveur / client, et je me trouve confronté à un probème : le serveur acc Probleme Architecture client Serveur Multithread [ par kawito ] Bonjour,j'ai fais un client serveur TCP qui doit gerer n connexions(win32 c++) winsowk1.1.le serveur gere les connexions a travers un thread acceptqui caractères indesirables avec recv(); [ par DJeS ] voici la partie de mon code problematique :char buf[5]; int g=recv(csock,buf,5,0);coutcoutje recois bien 5 octets de données selon mon int g(autant sockets send() recv() [ par dletozeun ] bonjour,j'essais de faire communiquer 2 progs avec les sockets et send() et recv() est il possible d'envoyer autre chose qu'une chaine avec la fonctio 2 send, 1 seul recv [ par chriskang ] J'ai créé une application de type client-serveur qui réagit bizarrement lorsque je fais plusieurs send consécutifs vers une même socket.Au cours de me send et recv [ par StayCrunchy ] Bonsoir, J'ai un petit soucis avec les fonctions send et recv. j'ai fait un petit programme qui permet d'envoyer un fichier d'un serveur à un client. send et recv dans le meme programme [ par obader ] Salut a tous J'ai fait un petit programme client qui se connecte à un seveur téléphonique, mon programme contient un snd suivi d'un recv, le snd march savoie si le Client est déconnecté [ par amoweb ] Salutje suis entrain de faire un serveur HTTP avec GCC ( sous windows).Le problème c'est que si le client se déconnecte pendant que j'envoie un fichie Problème client/serveur -> flux du recv avec un air d'extraterrestre [ par thispawn ] Bonjour j'ai codé un système client serveur. Dès que le client arrive a se connecter il envoi avec 3 send ceci : format B ou D | taille du buffer | bu Socket [ par c2millet ] Bonjour à tous,je voudrais dans un premier tps si qqun a ou connais une doc sur les sockets. Ensuite, g un petit pb. g réalisé un serveur qui lit sur


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,482 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales