Determing the number of bytes ready to be recv()'d

后端 未结 2 2047
隐瞒了意图╮
隐瞒了意图╮ 2020-12-10 23:06

I can use select() to determine if a call to recv() would block, but once I\'ve determined that their are bytes to be read, is their a way to query how many bytes are curren

相关标签:
2条回答
  • 2020-12-10 23:53

    If your OS provides it (and most do), you can use 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 provides an analogous ioctlsocket(..,FIONREAD,..), which expects a pointer to unsigned long:

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

    The ioctl call should work on sockets and some other fds, though not on all fds. I believe that it works fine with TCP sockets on nearly any free unix-like OS you are likely to use. Its semantics are a little different for UDP sockets: for them, it tells you the number of bytes in the next datagram.

    The ioctlsocket call on Windows will (obviously) only work on sockets.

    0 讨论(0)
  • 2020-12-11 00:03

    No, a protocol needs to determine that. For example:

    • If you use fixed-size messages then you know you need to read X bytes.
    • You could read a message header that indicates X bytes to read.
    • You could read until a terminal character / sequence is found.
    0 讨论(0)
提交回复
热议问题