踩坑日记——tcp/ip,BROKEN PIPE错误的原因以及解决方法

背景

        开发过一个协议,一共有两个服务,第一个服务接收移动平台推送的数据,并使用tcp/ip方式进行数据收发至第二个服务进行数据解析及设备响应。但一段时间后发现使用tcp/ip方式发送数据出错,错误信息为BROKEN PIPE。在度娘上找了找,主要有两个方面。

原因

        原因一、项目中存在大量的print输出,导致pipe容量不足,使用nohup后台进程处理之后信息会不断地发送给远程pc,如果信息接着不断发送,就会导致pipe容量不足,信息堵塞。

        原因二、tcp/ip连接方式进行数据发送、接收。发送方(客户端),接收方(服务端),首先建立socket连接,建立连接后进行数据发送接收。连接的两端必需都打开。连接读端关闭,写端不能写,否则会发出SIGPIPE信号,即会生成BROKEN PIPE错误。即发送端打开,接收端关闭时,发送数据时会出现BROKEN PIPE错误。

解决方法

        一、对于第一种原因,则将项目中所有的print注释或者删除,将必须输出的数据进行日志打印或者输出到指定文件中。

        二、对于第二种原因,最好的方式是开发时确保连接两端保持打开或者同时关闭。还可以项目中进行设置,忽略SIGPIPE信号。

from signal import signal, SIGPIPE, SIG_DFL
# 忽略 SIGPIPE 信号
signal(SIGPIPE,SIG_DFL)

上一篇:linux mint 让windows可以使用远程桌面的xrdp服务


下一篇:Broken Keyboard (a.k.a. Beiju Text) UVA - 11988