专业财税服务推荐

精选优质财税服务,为企业提供专业、可靠的财税解决方案,助力企业健康发展

零报税代理记账
零申报代理记账
报税做账算帐财务报表老会计做账
代理记账
咨询微信:lhy_happyday
工商营业执照年度年报年检公示
全国个体、企业、公司、合作社工商年审年报服务!
个体/10元/次 企业/20元/次
咨询微信:lhy_happyday
财税咨询服务
一对一专业财税咨询,解决企业财税难题,提供定制方案
咨询微信:lhy_happyday
财务分析服务
小规模个体报税0申报税务年报工商年报月报季报报税代理记账
咨询微信:lhy_happyday
立即咨询专业财税顾问
微信号: lhy_happyday
会计从业9年,管理多家个体工商、小规模、一般纳税人等企业的财务、税务等相关工作!。
扫码或搜索添加微信,备注"财税咨询"获取专属优惠
知方号 知方号

LinuxLinux select多路复用socket一直返回 tcp重连后文件描述符不变

作者:李春港出处:https://www.cnblogs.com/lcgbk/p/14776820.html

目录一、前言二、问题三、原因四、解决方案

一、前言

最近遇到了一个很奇怪的问题,代码逻辑是这样:我使用Linux的socket进行TCP连接通信,客户端在一个独立的线程间隔5s时间不停给服务端发送心跳,服务端也会根据心跳回应。如果数据接收线程在8s内都没有接收到任何数据,则close(socket)关闭套接字。数据接收:在数据接收线程使用了select多路复用机制,对socket是否有数据到来进行监听。

二、问题

当关闭套接字的时候,数据接收线程发现select函数一直返回有文件描述符有数据到来,但是实际读取socket套接字文件描述符的时候发现一直返回-1。

三、原因

这个原因我们可以通过Linux的手册查看select的说明即可知道答案,在Linux终端使用 man select 查看,我发现一下这一段内容:

Multithreaded applicationsIf a file descriptor being monitored by select() is closed in another thread, the result is unspecified. On some UNIX systems, select() unblocks and returns, with an indication that the file descriptor is ready (a subsequent I/O operation will likely fail with an error, unless another the file descriptor reopened between the time select() returned and the I/O operations was performed). On Linux (and some other systems), closing the file descriptor in another thread has no effect on select(). In summary, any application that relies on a particular behavior in this scenario must be considered buggy.

译文:

多线程应用程序如果select()监视的文件描述符在另一个线程中被关闭,则结果是未指定的。 在某些UNIX系统上,select()解除阻塞并返回,并指示文件描述符已经就绪(后续的I/O操作可能会失败并出现错误,除非在返回select()和执行I/O操作之间重新打开文件描述符)。 在Linux(和其他一些系统)上,在另一个线程中关闭文件描述符对select()没有影响。 总之,在这个场景中,任何依赖于特定行为的应用程序都必须被认为是有bug的。

由select的手册得知,这是select函数的一个bug,所以我们在使用select的时候需要注意。

四、解决方案

思路:

如果在select多路复用一直返回成功,但是实际读取文件描述符数据错误的时候,就关闭socket,数据接收线程先不要再去监听这个描述符;去告诉心跳线程不要再发送心跳并且重连服务端;心跳线程发现接收线程发过来的重连信号,则停止发送心跳并且在一定的时间间隔去重连服务端;心跳线程重连服务端成功,告诉数据接收线程socket已经成功连接服务端,可以继续监听socket描述符。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。