在POSIX TCP套接字上,保持连接失败会导致挂起的read()返回吗?

3

假设以下事件序列:

  • 在启用了 keep-alive 的 POSIX TCP 套接字上执行 read(),但没有可用的数据。
  • keep-alive 机制判断连接已断开。

假如忽略了 SIGPIPE ,那么 read() 会返回吗?

1个回答

2

如果出现errno == ECONNRESET,它会返回-1。


你有这个的参考资料吗? - Steve Emmerson
1
@SteveEmmerson 这方面可能没有单一的参考,它是经验性的推断。启用 TCP keepalive 导致 TCP 栈定期发送空段,如果它们没有被确认,则 TCP 连接被视为中断,将发送 RST,同时也像任何由于缺少 ACK 而超时的 TCP 栈会话一样返回到本地应用程序。 - nos
@nos 谢谢。我持谨慎态度的原因是因为我曾经吃过亏,发现在一个线程中close()一个套接字并不会导致另一个线程上的select()poll()返回 -- 所以套接字并不总是表现得像它们“应该”那样。 - Steve Emmerson
@nos 关于close和poll/select,我原本期望poll/select会返回并指示套接字上的读取不会阻塞——而读取将返回0字节或错误条件。然而,这种情况并未发生——导致需要编写更复杂的(解决)代码。 - Steve Emmerson
@SteveEmmerson 我个人认为select()应该返回-1/EBADF,否则就会阻塞直到在打开的套接字上发生了某些事情,...所以你知道了 :-| - user207421
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接