[英]Linux recv vs. BSD recv vs. POSIX recv return zero behavior
我一直在写一个网络库,困扰我的一件事是recv()
function 的行为,即它可能的返回值。
POSIX 手册页记录了 3 个案例:
recv()
将返回消息的长度(以字节为单位)recv()
将返回 0请注意,返回的“消息长度”甚至没有被证明高于零。 手册页的 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请注意,返回的“消息长度”甚至没有被证明高于零。 手册页的 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.