int where_len;
(...)
where_len = sizeof (where);
if (getsockname (sockfd,
(struct sockaddr *) &where,
(socklen_t *) &where_len) < 0) {
Erreur: tu déclares where_len comme int, mais tu y mets un size_t, que tu utilises ensuite comme un socklen_t (qui fait au moins 32 bits suivant POSIX)...
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.
buf = (char *) malloc (buf_len);
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().
for (i = 0; i < len; i+= buf_len) {
int sz;
sz = MIN (buf_len, (len - i));
if (send (sockfd, buf, sz, 0) != sz) {
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.
[^] # Re: Documentation incorrecte
Posté par alf . En réponse au message Appel systeme send (). É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.