繁体   English   中英

Linux recv vs. BSD recv vs. POSIX recv 返回零行为

[英]Linux recv vs. BSD recv vs. POSIX recv return zero behavior

我一直在写一个网络库,困扰我的一件事是recv() function 的行为,即它可能的返回值。

POSIX 手册页记录了 3 个案例:

  • 成功完成后, recv()将返回消息的长度(以字节为单位)
  • 如果没有消息可以接收并且对等方已经执行了有序关闭, recv()将返回 0
  • 否则,应返回 -1 并设置 errno 以指示错误

请注意,返回的“消息长度”甚至没有被证明高于零。 手册页的 rest 没有涵盖提供的length参数为零的可能性。 Errors 部分也不表示零是length的无效值。

现在, recv()Linux 手册页表明:

如果从 stream 套接字接收的请求字节数为 0,则也可能返回值 0。

这里是我找到的第一个 BSD* 手册页, recv()的 OpenBSD 手册页,如果与其他 BSD* 发行版不同,它看起来很相似; 它说:

这些调用返回接收到的字节数,如果发生错误,则返回 -1。

阅读手册页,似乎 BSD 实现更喜欢在连接关闭时返回错误( ECONNRESET ?)而不是返回零。

因此,我的问题是……这里到底发生了什么? 我应该遵循什么 model 以确保我的库适用于所有recv()实现? 这些实现似乎都不尊重 POSIX model 是否正常? 对于 BSD recv()来说甚至返回零吗?

我一直在写一个网络库,困扰我的一件事是recv() function 的行为,即它可能的返回值。

POSIX 手册页记录了 3 个案例:

  • 成功完成后, recv()将返回消息的长度(以字节为单位)
  • 如果没有消息可以接收并且对等方已经执行了有序关闭, recv()将返回 0
  • 否则,应返回 -1 并设置 errno 以指示错误

请注意,返回的“消息长度”甚至没有被证明高于零。 手册页的 rest 没有涵盖提供的length参数为零的可能性。 Errors 部分也不表示零是length的无效值。

现在, recv()Linux 手册页表明:

如果从 stream 套接字接收的请求字节数为 0,则也可能返回值 0。

这里是我找到的第一个 BSD* 手册页, recv()的 OpenBSD 手册页,如果与其他 BSD* 发行版不同,它看起来很相似; 它说:

这些调用返回接收到的字节数,如果发生错误,则返回 -1。

阅读手册页,似乎 BSD 实现更喜欢在连接关闭时返回错误( ECONNRESET ?)而不是返回零。

因此,我的问题是……这里到底发生了什么? 我应该遵循什么 model 以确保我的库适用于所有recv()实现? 这些实现似乎都不尊重 POSIX model 是否正常? 对于 BSD recv()来说甚至返回零吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM