Get the number of bytes available in socket by 'recv' with 'MSG_PEEK' in C++

前端 未结 2 1850
小蘑菇
小蘑菇 2020-12-24 15:39

C++ has the following function to receive bytes from socket, it can check for number of bytes available with the MSG_PEEK flag. With MSG_PEEK, the

相关标签:
2条回答
  • 2020-12-24 16:07

    On Windows, you can use the ioctlsocket() function with the FIONREAD flag to ask the socket how many bytes are available without needing to read/peek the actual bytes themselves. The value returned is the minimum number of bytes recv() can return without blocking. By the time you actually call recv(), more bytes may have arrived.

    0 讨论(0)
  • 2020-12-24 16:10

    You're looking for is ioctl(fd,FIONREAD,&bytes_available) , and under windows ioctlsocket(socket,FIONREAD,&bytes_available).

    Be warned though, the OS doesn't necessarily guarantee how much data it will buffer for you, so if you are waiting for very much data you are going to be better off reading in data as it comes in and storing it in your own buffer until you have everything you need to process something.

    To do this, what is normally done is you simply read chunks at a time, such as

    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);
    

    And if you don't want to sit there waiting for data, you should look into select or epoll to determine when data is ready to be read or not, and the O_NONBLOCK flag for sockets is very handy if you want to ensure you never block on a recv.

    0 讨论(0)
提交回复
热议问题