加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unix – 在没有结束调用close()或崩溃的情况下,什么会导致自发的

发布时间:2020-12-15 21:40:02 所属栏目:安全 来源:网络整理
导读:我有一个由两个进程组成的应用程序(让我们称之为A和B),通过Unix域套接字相互连接.大多数情况下它工作正常,但有些用户报告以下行为: A向B发送请求.这有效. A现在开始阅读B的回复. B向A发送回复.相应的write()调用返回EPIPE错误,结果B关闭()套接字.但是,A没有
我有一个由两个进程组成的应用程序(让我们称之为A和B),通过Unix域套接字相互连接.大多数情况下它工作正常,但有些用户报告以下行为:

> A向B发送请求.这有效. A现在开始阅读B的回复.
> B向A发送回复.相应的write()调用返回EPIPE错误,结果B关闭()套接字.但是,A没有关闭()套接字,也没有崩溃.
> A的read()调用返回0,表示文件结束. A认为B过早地关闭了连接.

用户还报告了此行为的变化,例如:

> A向B发送请求.这部分工作,但在发送整个请求之前A的write()调用返回EPIPE,结果是一个close()套接字.但是B没有关闭()套接字,也没有崩溃.
> B读取部分请求然后突然获得EOF.

问题是我无法在本地重现此行为.我试过OS X和Linux.用户使用各种系统,主要是OS X和Linux.

我已经尝试过并考虑过的事情:

> Double close()错误(在同一文件描述符上调用close()两次):可能不会导致EBADF错误,但我还没有看到它们.
>增加最大文件描述符限制.一位用户报告说这对他有用,其余用户报告说没有.

还有什么可能导致这样的行为?我肯定知道A和B都不会过早地关闭()套接字,并且我肯定地知道它们都没有崩溃,因为A和B都能够报告错误.好像内核突然决定出于某种原因从插座拔出插头.

解决方法

也许你可以尝试strace,如: http://modperlbook.org/html/6-9-1-Detecting-Aborted-Connections.html中所述

我假设您的问题与此处描述的问题有关:http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable

不幸的是,我自己有一个similar problem,但无法通过给定的建议来解决问题.但是,也许SO_LINGER的东西适合你.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读