Linux 关闭插座的最佳实践。那么你是留恋还是关机/关闭?
外面有很多混杂的信息 我只是想确保数据已完全发送。我应该关机/关闭,还是在暂停和超时的情况下关闭 我在Linux下使用epoll的非阻塞套接字,OSX下的相同代码(带有定义)使用kqueue。这似乎是因为,林格在所有平台上的工作方式都不尽相同 另外,在非阻塞套接字上使用SO_LINGER时,如果您返回eWoldBlock,是否需要再次调用close,直到您没有获得eWoldBlock?或者在这种情况下,我可以忽略close中的eWoldBlock错误吗 我只是想确保数据已完全发送。我应该关机/关机吗 是的,见下文 还是以暂停和超时结束 我觉得这一点用处都没有,见下文 我在Linux下使用epoll的非阻塞套接字,OSX下的相同代码(带有定义)使用kqueue。这似乎是因为,林格在所有平台上的工作方式都不尽相同 应该是的,但谁知道呢?有一篇关于TCP实现差异的大型论文,所以据我记忆所及,其中没有提到_LINGER。但我可以的时候再查 另外,在非阻塞套接字上使用SO_LINGER时,如果您返回eWoldBlock,是否需要再次调用close,直到您没有获得eWoldBlock?或者在这种情况下,我可以忽略close中的eWoldBlock错误吗 理论上,您应该再次调用Linux 关闭插座的最佳实践。那么你是留恋还是关机/关闭?,linux,macos,sockets,Linux,Macos,Sockets,外面有很多混杂的信息 我只是想确保数据已完全发送。我应该关机/关闭,还是在暂停和超时的情况下关闭 我在Linux下使用epoll的非阻塞套接字,OSX下的相同代码(带有定义)使用kqueue。这似乎是因为,林格在所有平台上的工作方式都不尽相同 另外,在非阻塞套接字上使用SO_LINGER时,如果您返回eWoldBlock,是否需要再次调用close,直到您没有获得eWoldBlock?或者在这种情况下,我可以忽略close中的eWoldBlock错误吗 我只是想确保数据已完全发送。我应该关机/关
close()
,以遵从EAGAIN,但我想知道它是否真的有效。在关闭时将套接字置于阻塞模式更有意义,因为您无法选择任何选项来告诉您何时写入了所有数据。但是您仍然存在这样一个问题:如果超时发生,套接字关闭,数据可能会丢失,现在除了记录问题的可能性之外,您什么也做不了
然而,回到你的问题上来。确保在关闭前已写入并接收所有数据的方法是关闭套接字以在两端写入,然后在两端发出读取,该读取应返回流的末尾(
recv()
返回零),然后关闭套接字。这样,你就知道,两个对等点同时接近尾声,已经读取了所有数据。如果recv()
返回数据,则应用程序协议中存在错误。我认为这一切都应该在阻塞模式下进行。@cklin-不,这不是重复。一个是关于零超时的sou-LINGER行为。我在问一个完全不同的问题。