代码之家  ›  专栏  ›  技术社区  ›  Adrian

对于C TCP套接字,“send”是否可以返回零?

  •  16
  • Adrian  · 技术社区  · 14 年前

    C有可能吗 send 函数在使用TCP套接字时返回零?手册页只是说它将返回发送的字节数,但我不确定它是否只返回-1,当它不能发送任何数据时。

    5 回复  |  直到 6 年前
        1
  •  17
  •   paxdiablo    8 年前

    我很肯定,虽然记忆在时间的迷雾中很深,但我以前看到过它返回零,在大量数据传输的情况下,另一端没有跟上。

    从内存来看,在这种情况下,远程TCP堆栈缓冲区已满,堆栈通知本地端它将延迟,直到清除一些空间,本地缓冲区也已满。

    在这一点上,技术上它不是一个错误(因此没有返回-1),但是本地堆栈不能接受任何数据。

    我不是 完全地 现在肯定是这样,因为当前的POSIX标准似乎表明它在这种情况下只会阻塞(或者如果设置为非阻塞,则会失败)。

    然而,我怀疑这是一个没有意义的观点。你 有可能它会回来 较少的 而不是您请求发送的字节,因此您应该有适当的代码来处理它。

    而且,由于它与处理“零字节”几乎是相同的逻辑处理“比您请求的少一个”,所以您也可以假设它可以返回零。

        2
  •  4
  •   Jeremy Friesner    14 年前

    好吧,总是有这样一种情况,你把0作为发送的字节数传递给……在这种情况下,“返回发送的字节数”表示它应该返回零字节。

    不管怎样,最好还是正确地处理返回零的情况;这不会造成伤害,而且可能会有所帮助。

        3
  •  3
  •   torak    14 年前

    答案很可能取决于实现,因此根据操作系统的不同而有所不同。

    一种情况,当您请求0字节的传输时,预期为0。

        4
  •  1
  •   user207421    8 年前

    BSD 男人 页面状态:

    如果套接字上没有可用的消息空间来保存要传输的消息,那么send()通常会阻塞,除非套接字已置于非阻塞I/O模式。

    POSIX规范进一步说明了在阻塞模式下 全部的 除非发生中断,否则将传输数据。

    在这两种情况下,除非提供的计数为零,否则无法返回零。

        5
  •  0
  •   jno    6 年前

    我确实观察到从 send(2) 关于一个 AF_UNIX 立即键入socket。

    是的,这是由于 size 零值字段。

    所以,JFYI。