首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当TCP保持活动中断连接时,我会得到什么套接字错误?

当TCP保持活动中断连接时,我会得到什么套接字错误?
EN

Stack Overflow用户
提问于 2012-12-11 16:25:01
回答 2查看 6.3K关注 0票数 9

我有一组TCP套接字(间隔1分钟),由select(2)循环控制(选择读)。

  • 如果设置中的一个套接字发生了“保持活动超时”,select(2)会返回错误吗?
  • read(2)将返回哪个错误?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-12 13:43:30

  • 如果为其选择的一个套接字发出错误信号,则select()本身不会返回错误。事实上,API不能以这种方式指示每个套接字错误,因为两个不同的套接字可以在单个select()调用期间获得一个挂起的错误。select()会返回哪一个?
  • select()循环的每一次迭代之后,您可以使用FD_ISSET宏在标记为可读的每个套接字上尝试一个read()
  • 每当套接字有一个挂起的错误集时,它的读事件(和写事件)就会被发出信号,并且select()会返回,这样您就可以捕获由于保持-活动而导致的超时错误。请注意,选择标记为read的套接字并不表示要读取数据,而只是表示试图读取不会阻止。如果套接字有一个挂起的错误要检索,读取将不会阻塞。在尝试处理任何数据之前,read(2)write(2)都首先检索套接字上任何挂起的错误。 当对具有O_NONBLOCK清除的输入函数的调用不会阻塞时,无论该函数是否会成功地传输数据,描述符都应被视为可以读取。(该函数可能返回数据、文件结束指示或错误,而不是指示它被阻塞的错误,在每种情况下,描述符都应被视为可以读取。) [POSIX:select()]
  • 最后,返回什么错误?关键是,这取决于如何保持活着的失败。如果另一端完全消失,你就会得到ETIMEDOUT。如果出现了数据包传递错误,您将通过它(因此,如果保持活动的数据包得到一个ICMP错误答复,比如“主机不可达”,您将得到EHOSTUNREACH )。有关这些情况的详细信息,请参阅Stevens,"Unix网络编程,第1卷“。

票数 5
EN

Stack Overflow用户

发布于 2012-12-12 13:11:59

select()FDSET中设置一个位,指示哪个套接字已经触发。使用ISSET宏确定哪个套接字请求服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13824231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档