Obtenir le nombre d'octets disponibles dans le socket par 'recv' avec 'MSG_PEEK' en C ++
C++ a la fonction suivante pour recevoir des octets à partir de socket, il peut vérifier le nombre d'octets disponibles avec le MSG_PEEK
drapeau. Avec MSG_PEEK
la valeur retournée de "recv" est le nombre d'octets disponibles dans le support:
#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags);
J'ai besoin d'obtenir le nombre d'octets disponibles dans le support sans créer de buffer
(sans allouer de la mémoire pour buffer
). Est-il possible, et comment?
source d'informationauteur jondinham
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la recherche pour est
ioctl(fd,FIONREAD,&bytes_available)
, et sous windowsioctlsocket(socket,FIONREAD,&bytes_available)
.Soyez averti, cependant, le système d'exploitation n'est pas nécessairement garantir combien données de la mémoire tampon pour vous, donc si vous êtes en attente pour beaucoup de données que vous allez être mieux de lire dans les données, il s'agit dans et de le stocker dans votre propre tampon jusqu'à ce que vous avez tout ce dont vous avez besoin pour traiter quelque chose.
Pour ce faire, ce qui est normalement fait est tout simplement vous lire des morceaux à la fois, comme
Et si vous ne voulez pas rester assis là à attendre de données, vous devriez regarder dans
select
ouepoll
à déterminer lorsque les données sont prêtes à être lu ou pas, et laO_NONBLOCK
drapeau pour les sockets est très pratique si vous voulez vous assurer de ne jamais bloquer sur un recv.Sur Windows, vous pouvez utiliser le
ioctlsocket()
fonction avec laFIONREAD
drapeau de demander la prise combien d'octets sont disponibles sans avoir besoin de lire/peek les octets réels eux-mêmes. La valeur retournée est le nombre minimum d'octetsrecv()
pouvez le retourner sans blocage. Par le temps que vous appelezrecv()
plus d'octets peuvent être arrivés.