bonjour a tous,
je realise des appels systemes send () en C, en tres grande quantite (petit programme test de debit reseau). je suis sur 2 PC en Mandriva 2006
hors, je tombe sur le probleme suivant:
par moment, l'appel send () me retourne une valeur inferieure a la valeur du len (3e parametre du send ()).
si je comprends bien le man, avec les options par defaut (appel bloquant), soit le send me renvoie -1, soit il bloque jusqu'a ce que toutes les donnees soient passees au systeme ?
aurais-je rate qq chose ?
si qq peut eclairer ma lanterne...
merci
don
# Documentation incorrecte
Posté par alf . Évalué à 1.
Ton implémentation de send() est donc peut-être correcte, mais sûrement pas la doc (conforme ou pas, de toute façon il y a un écart entre le code et la doc, donc un rapport de bug s'impose).
[1] http://www.opengroup.org/bookstore/catalog/t041.htm
[^] # Re: Documentation incorrecte
Posté par donaldo78 . Évalué à 1.
If the message is too long to pass atomically through the underlying protocol, the message is not transmitted, -1 is returned, and errno is set to [EMSGSIZE].
et c'est la que je ne comprends pas. dans mon appel a send(), d'apres cetter phrase, soit toute passe d'un coup, soit rien ne passe et j'ai une erreur qui me remonte...
hors, moi, seule une partie du buffer est envoyee, et je n'ai pas d'erreur de remontee (appel = succes)
il me semble alors que dans le cas d'un appel bloquant, la portion de la doc que tu cites est en contradiction avec la phrase juste apres dans la doc que je cites. parcontre, ce serait ok dans le cas d'un appel non bloquant...
qq a-t-il une explication sur le sujet ?
[^] # Re: Documentation incorrecte
Posté par alf . Évalué à 1.
De plus, est-ce que la longueur du buffer correspond bien à l'argument length ? et ca tient bien dans un size_t ?
[^] # Re: Documentation incorrecte
Posté par donaldo78 . Évalué à 1.
[^] # Re: Documentation incorrecte
Posté par alf . Évalué à 1.
Je n'ai pas regardé en détail la norme, mais la relation entre int et size_t ne semble pas définie. J'ai juste trouvé dans 7.17p4 une recommandation que size_t ne soit pas plus grand que long.
En C, contrairement au C++, on ne DOIT pas caster le retour de malloc(). 1) c'est inutile et 2) ça peut cacher l'absence de l'include correspondant. Et si on utilise une fonction sans avoir son prototype, on se rapproche du comportement indéfini (je ne me souviens plus du statut exact, mais je soupçonne l'UB).
Je suppose que, dans ton "vrai" code non simplifié, tu vérifies le retour de malloc().
Pourquoi n'as-tu pas déclaré sz de type size_t ? Idem pour i et len; je ne vois pas pourquoi tu utilises des int alors que tu as besoin de size_t, vu que malloc, sizeof, send et plein d'autres travaillent avec ce type. En utiliser un autre mène tôt ou tard à avoir des valeurs hors domaine, et à des bugs difficilement identifiables.
Ca a peut-être l'air de chipotage, mais puisque C et POSIX se décarcassent à définir des prototypes précis pour leurs fonctions, autant les respecter.
Je ne sais pas si ça résoudra ton problème précis, mais au moins ça t'en évitera d'autres.
# Man pages
Posté par xfred31 . Évalué à 1.
Extrait de la man-page (Linux) :
When the message does not fit into the send buffer of the socket, send normally blocks, unless the socket has been
placed in non-blocking I/O mode.
A priori, rien ne dit que le message entier est supposé être délivré même si sa longeur est inférieure à la limite imposée localement. J'ai rencontré ce cas à plusieurs reprise et j'ai interprété la valeur de retour (si est elle strictement supérieure à 0) comme étant l'offset de départ pour le prochain send :
The calls return the number of characters sent, or -1 if an error occurred.
Cela afin d'envoyer le message complètement. Je crois qu'il s'agit d'une approche assez classique (?).
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.