TCP peut fusionner et diviser arbitrairement des paquets. Donc, en supposant que je fais, par exemple, un tel appel:Le bloc `recv` sera-t-il bloqué sur un socket TCP lorsque je demande plus de données que ce qui est immédiatement disponible?
`recv(sock, buf, 15, 0)`
Mais à ce moment seulement 5
octets de données est immédiatement disponible -
bloquerons recv()
jusqu'à ce que 15
octets de données sont disponibles ou seront Je reçois seulement 5
octets?
Je demande parce que je voudrais savoir si je peux lire, par exemple, un uint32_t
simplement de cette façon (en supposant i
est une variable de type uint32_t
):
if(recv(sock, &i, sizeof(uint32_t), 0) < sizeof(uint32_t)) {
/* error */
}
i = ntohl(i);
Ou dois-je plutôt doivent faire quelque chose comme ça:
unsigned char buff[sizeof(uint32_t)];
ssize_t read_already = 0;
while(read_already != sizeof(uint32_t)) {
ssize_t read_now = recv(sock, buff, sizeof(uint32_t)-read_already, 0);
if(read_now == -1) {
/* error */
}
else {
read_already += read_now;
}
}
memcpy(&i, buff, sizeof(uint32_t));
i = ntohl(i);
ce dernier est nettement plus laid et plus ardu, mais malheureusement si nécessaire recv()
ne bloque pas jusqu'à ce qu'il reçoive toutes les données demandées dans le cas où le paquet est divisé.
Merci. Donc, il n'y a pas d'échappatoire à la laideur et la pénibilité de mon deuxième extrait? – gaazkam
'MSG_WAITALL' pourrait répondre à vos besoins. Il y a un bug dans votre snippet (vous n'avez pas fait le calcul du pointeur sur buff dans votre question). Voir l'exemple de code que j'ai fourni. – selbie