【发布时间】:2011-07-19 07:00:03
【问题描述】:
我现在至少阅读了 10 次文档,并且还阅读了大约 10 个代码 sn-ps 和使用非阻塞套接字发送数据的完整程序。问题是有些教程要么是为初学者准备的(Beejs f.i.),要么是他们的假设相当草率;那些并不复杂的是专门的代码示例,没有解释他们为什么要做他们所做的事情。在我看来,即使是 SO 知识库也不能详尽地涵盖 send 行为的整个范围。我所追求的是 f.e 的详细信息:
- 返回码 0 的确切含义是什么,是否值得检查
errno还是应该直接丢弃连接而不进行进一步调查? - 获得负返回值是否保证关闭连接变坏,还是只有这样,除非
errno是EWOULDBLOCK、EAGAIN或EINTR(...其他)? - 当返回值为
> 0时是否值得检查errno?显然,该值表示“发送”的数据量(在引号中,因为它确实是一个很长的过程,对),但由于套接字是非阻塞的,这是否意味着可以立即发出另一个调用,或者,取决于@987654329 @ 再次,应该等待下一个发送时机(使用 select/poll/epoll)? - 基本上,是否首先检查返回值,然后才检查
errno值?或者也许send在每次调用时设置errno,不管返回值?这将使错误检查更容易一些... - 如果一个人得到
EINTR,对于程序来说,什么是好的、健壮的行为?只需记录状态并在下一次发送时重试,例如EWOULDBLOCK和EAGAIN? - 是否同时检查 both
EWOULDBLOCK和EAGAIN?我们可以相信两者具有相同的价值,还是取决于实施? -
send是否为流套接字返回EMSGSIZE?如果不是,那么缓冲区大小不会太大,对吧? - 返回值本身是否可以等于任一已知错误代码?
如果您能提供一个健壮的非阻塞发送代码示例,我们将不胜感激。
【问题讨论】:
标签: sockets send nonblocking berkeley-sockets