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