【问题标题】:Determing the number of bytes ready to be recv()'d确定准备接受 recv() 的字节数
【发布时间】:2010-10-13 17:29:50
【问题描述】:

我可以使用 select() 来确定对 recv() 的调用是否会阻塞,但是一旦我确定它们是要读取的字节,它们是一种在我实际之前查询当前可用字节数的方法调用recv()?

【问题讨论】:

    标签: select blocking libc


    【解决方案1】:

    如果您的操作系统提供(并且大多数都提供),您可以使用 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 提供了一个类似的 ioctlsocket(..,FIONREAD,..),它需要一个指向 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;
    }
    

    ioctl 调用应该在套接字和其他一些 fd 上工作,尽管不是在所有 fd 上。我相信它几乎可以在您可能使用的任何免费的类 unix 操作系统上与 TCP 套接字一起工作。对于 UDP 套接字,它的语义略有不同:对于它们,它告诉您下一个数据报中的字节数。

    Windows 上的 ioctlsocket 调用将(显然)仅适用于套接字。

    【讨论】:

      【解决方案2】:

      不,协议需要确定这一点。例如:

      • 如果您使用固定大小的消息,那么您知道您需要读取 X 个字节。
      • 您可以读取指示要读取 X 个字节的消息头。
      • 您可以一直阅读,直到找到终端字符/序列。

      【讨论】:

      • 实际上,即使您可以确定可用的字节,您仍然需要一个协议来知道如何解释这些字节......我要求的是一个非常具体的目的......
      • 还不错;只是试图扩展“否”的简短答案。
      猜你喜欢
      • 2015-02-16
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2016-02-26
      • 2018-12-05
      • 2019-07-14
      相关资源
      最近更新 更多