Je peux utiliser select() pour déterminer si un appel à recv() bloquerait, mais une fois que j'ai déterminé qu'il s'agit d'octets à lire, c'est leur un moyen d'interroger combien d'octets sont actuellement disponibles avant que j'appelle réellement recv()?Déterminer le nombre d'octets prêts à être recv() 'd
1
A
Répondre
3
Si votre système d'exploitation fournit (et la plupart ne), vous pouvez utiliser ioctl (.., FIONREAD, ..):
int get_n_readable_bytes(int fd) {
int n = -1;
if (ioctl(fd, FIONREAD, &n) < 0) {
perror("ioctl failed");
return -1;
}
return n;
}
Windows fournit un ioctlsocket analogue (.., FIONREAD ,. .), qui attend un pointeur sur un long non signé:
unsigned long get_n_readable_bytes(SOCKET sock) {
unsigned long n = -1;
if (ioctlsocket(sock, FIONREAD, &n) < 0) {
/* look in WSAGetLastError() for the error code */
return 0;
}
return n;
}
L'appel ioctl devrait fonctionner sur les sockets et quelques autres fds, mais pas sur tous les fds. Je crois que cela fonctionne très bien avec les sockets TCP sur presque tous les systèmes d'exploitation libres de type Unix que vous utiliserez probablement. Sa sémantique est un peu différente pour les sockets UDP: pour eux, elle vous indique le nombre d'octets dans le prochain datagramme.
L'appel ioctlsocket sur Windows ne fonctionnera (de toute évidence) que sur les sockets.
2
Non, un protocole doit déterminer cela. Par exemple:
- Si vous utilisez des messages de taille fixe, vous savez que vous devez lire X octets.
- Vous pouvez lire un en-tête de message qui indique X octets à lire.
- Vous pouvez lire jusqu'à ce qu'un caractère/séquence terminal soit trouvé.
En fait, même si vous pouviez déterminer les octets disponibles, vous auriez toujours besoin d'un protocole pour savoir interpréter ces octets ... Je demandais un but très précis ... – dicroce
Assez juste; j'essaie simplement de développer la réponse courte de "Non". –