我得到什么套接字错误时,TCP保持活动断裂的连接?(What socket error do I g

2019-07-04 22:52发布

我有一组与保活(间隔1分钟)TCP套接字,通过受控的select(2)环(选择用于读出的)。

  • select(2)如果保持活动超时发生在一组的插口内返回一个错误?
  • 这错误将read(2)回报?

Answer 1:

  • select()本身不一样,如果发出错误信号为它选择的插槽中返回一个错误。 [事实上,API不能指示每个插槽的错误这种方式,因为有两个不同的插座可以在每个单一通话过程中获得挂起的错误select() 哪一个会select()返回?]
  • 在每次迭代后select()循环中,而是使用FD_ISSET宏来尝试read()标记读取每个插座上。
  • 任何时候,一个插座有一个挂起的错误设定,其读取事件(写事件)的信号,并且select()的回报,让你拿起由于保活立即超时错误。 请注意,选择标记为读取插槽并不表明有数据读取,只有阅读的尝试不会阻止。 如果插座有一个未决错误检索,阅读不会阻止。 这两种read(2)write(2)第一个尝试甚至以处理任何数据之前检索套接字上任何挂起的错误。

    一个描述符应阅读时输入功能的调用与O_NONBLOCK明确不会阻止,该功能是否会成功传输的数据被认为是准备好了。 (该函数可能返回数据,结束文件的指示,或多于一个的指示它被阻塞,并且在每一种情况下的描述符应考虑准备用于读取其它错误。)[ POSIX:选择() ]

  • 最后,返回什么错误? 最重要的是,它取决于存活如何失败。 你会得到ETIMEDOUT如果另一端完全消失。 如果发生数据包传输错误,你会得到通过,而不是(所以如果保留的数据包得到一个ICMP错误回复,如“主机不可达”,你就会有EHOSTUNREACH交付)。 [关于这些案件的详细信息,请参阅史蒂文斯,“UNIX网络编程,第1卷”。]



Answer 2:

select()设置一个位在FDSET指示哪个插座已触发。 使用FD_ISSET宏来确定哪个插座要求的服务。



文章来源: What socket error do I get when TCP keep-alive breaks the connection?