踩坑日记——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)

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用VB实现客户服务器(TCP/IP)编程实例,可以按照以下步骤: 1. 首先,在Server端,通过VB编写代码以创建一个TCP/IP服务器。可以使用TcpListener类来创建监听器对象,指定服务器的IP地址和端口号。然后,使用Accept方法来等待客户端连接,并在连接成功时返回一个TcpClient对象。 2. 接下来,在Client端,同样通过VB编写代码来创建一个TCP/IP客户端。可以使用TcpClient类来创建一个客户端对象,并指定要连接的服务器的IP地址和端口号。 3. 在Server端,可以使用TcpClient对象的GetStream方法获取一个网络流对象,用于与客户端进行通信。通过网络流对象,可以使用StreamReader和StreamWriter类来读取和写入数据。 4. 在Client端,同样可以使用TcpClient对象的GetStream方法获取一个网络流对象,用于与服务器进行通信。通过网络流对象,也可以使用StreamReader和StreamWriter类来读取和写入数据。 5. 在Server端,可以使用一个无限循环来接收和处理客户端发送的消息。使用StreamReader的ReadLine方法读取客户端发送的消息,并使用StreamWriter的WriteLine方法向客户端发送消息。 6. 在Client端,可以使用StreamReader的ReadLine方法读取服务器发送的消息,并使用StreamWriter的WriteLine方法向服务器发送消息。 7. 最后,在Server端和Client端的适当位置,需要使用TcpClient对象的Close方法来关闭连接。 通过以上步骤,就可以使用VB实现一个简单的客户服务器(TCP/IP)编程实例。其中,Server端负责监听、接受和处理客户端连接,而Client端则负责与服务器建立连接并进行通信。使用网络流对象的StreamReader和StreamWriter类,可以实现双方的数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值