Vraag Haal het aantal beschikbare bytes in socket op met 'recv' met 'MSG_PEEK' in C ++


C ++ heeft de volgende functie om bytes uit socket te ontvangen, het kan controleren hoeveel bytes beschikbaar zijn met de MSG_PEEK vlag. Met MSG_PEEK, de geretourneerde waarde van 'recv' is het aantal bytes dat beschikbaar is in socket:

#include <sys/socket.h>
ssize_t recv(int socket, void *buffer, size_t length, int flags); 

Ik moet het aantal beschikbare bytes in de contactdoos krijgen zonder te creëren buffer (zonder toewijzing van geheugen voor buffer). Is het mogelijk en hoe?


10
2017-10-20 02:48


oorsprong


antwoorden:


Je bent op zoek naar is ioctl(fd,FIONREAD,&bytes_available) en onder ramen ioctlsocket(socket,FIONREAD,&bytes_available).

Maar wees gewaarschuwd: het besturingssysteem garandeert niet noodzakelijkerwijs hoeveel gegevens het voor u zal bufferen, dus als u op veel gegevens wacht, bent u beter in staat om gegevens in te lezen terwijl het binnenkomt en het op te slaan in uw eigen buffer totdat je alles hebt wat je nodig hebt om iets te verwerken.

Om dit te doen, is het normaal dat je eenvoudig stukjes leest, zoals

char buf[4096];
ssize_t bytes_read;
do {
     bytes_read = recv(socket, buf, sizeof(buf), 0);
     if (bytes_read > 0) {
         /* do something with buf, such as append it to a larger buffer or
          * process it */
     }
} while (bytes_read > 0);

En als u daar niet wilt wachten op gegevens, zou u moeten kijken select of epoll om te bepalen wanneer gegevens gereed zijn om te worden gelezen of niet, en de O_NONBLOCK vlag voor stopcontacten is erg handig als je ervoor wilt zorgen dat je nooit een recv blokkeert.


27
2017-10-20 03:00



In Windows kunt u de ioctlsocket() functie met de FIONREAD vlag om de socket te vragen hoeveel bytes beschikbaar zijn zonder de werkelijke bytes zelf te hoeven lezen / bekijken. De geretourneerde waarde is het minimumaantal bytes recv() kan terugkeren zonder te blokkeren. Tegen de tijd dat je daadwerkelijk belt recv()er kunnen meer bytes zijn aangekomen.


1
2017-10-20 03:39