一尘不染

TCP保持活动断开连接时会出现什么套接字错误?

linux

我有一组具有保持活动状态的TCP套接字(间隔1分钟),由select(2)
循环(选择读取)控制。

  • select(2)如果集合中的一个套接字发生了保持活动超时,是否会返回错误?
  • 哪个错误会read(2)返回?

阅读 255

收藏
2020-06-07

共1个答案

一尘不染

  • select()如果为其选择的其中一个套接字发出了错误信号,则它本身不会返回错误。[实际上,API无法以这种方式指示每个套接字的错误,因为两个不同的套接字可能在的一次调用中就各自获取挂起的错误select()。哪一个会select()回来?]
  • 在循环的每次迭代之后select(),您改而使用FD_ISSET宏read()在每个标记为可读的套接字上尝试。
  • 每当套接字设置了未决的错误集时,都会发信号通知其读取事件(和写入事件)并select()返回,从而使您可以立即拾取由于保持活动状态而导致的超时错误。请注意,选择标记要读取的套接字并不表示有数据要读取,只是读取尝试不会被阻止。如果套接字有未决错误要检索,则读取不会阻塞。无论read(2)write(2)第一甚至试图以处理任何数据之前检索套接字上任何挂起的错误。

当对O_NONBLOCK清除的输入函数的调用不会阻塞时,无论该函数是否成功传输数据,都应认为描述符已准备就绪,可以读取。(该函数可能返回数据,文件结尾指示或一个错误,表明该文件已被阻止,并且在每种情况下,描述符都应视为可以读取。)[
POSIX:select() ]

  • 最后,返回什么错误?至关重要的是,这取决于保持连接失败的方式。ETIMEDOUT如果另一端完全消失,您会得到的。如果发生数据包传递错误,您将转而通过(因此,如果保持活动的数据包收到ICMP错误回复,例如“主机不可达”,则将已EHOSTUNREACH传递)。[有关这些情况的更多详细信息,请参见Stevens,“ Unix网络编程,第1卷”。]
2020-06-07