tcp连接时,brokenpipe错误的原因以及解决方法

CTHON CTHON     2022-11-20     547

关键词:

问题:

写了一个server和一个client,UNIX套接字的,server不断接收消息并打印出来,client是一个交互程序,输入一个消息回车发送,接着又可以输入消息。
出问题了:
当server监听着,client第一次发送消息成功,server接收并打印出来了。
client第二次发送消息没成功并且结束程序了,server没接收到消息,保持继续监听。
我用GDB调试时,发现client第二次发送消息时,client收到SIGPIPE(Broken Pipe)信号。server明明还监听着,而且再次启动client还是第一次成功,第二次失败退出。

 同样的,当client因为断开(关闭了网络描述符sfd,或者ctrl+c/ctrl+\\异常断开),server端也产生SIGPIPE信号。

分析:

TCP协议是端到端的传输控制协议,之所以是“端到端”的协议,是因为”路由“是由IP协议负责的,TCP协议负责为两个通信端点提供可靠性保证,这个可靠性不是指一个端点发送的数据,另一个端点肯定能收到(这显然是不可能的),而是指,数据的可靠投递或者故障的可靠通知。

所谓的“端到端”,指的是在通信两端之间建立了一个全双工的通信管道,既然是管道,就不得不了解管道。

 

管道的特点:

  • 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
  • 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
  • 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
  • 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

管道特性的表现:

  • 如果一个进程以只写打开管道,但是没有以只读或读写打开这个管道的进程,则打开操作会阻塞, 直到有进程以读或读写打开,open 才会返回。(写端打开,读端关闭)
  • 如果一个进程以只读打开管道,但是没有以只写或读写打开这个管道的进程,则打开操作会阻塞, 直到有进程以写或读写打开,open 才会返回。(写端关闭,读端打开)
  • 当写端没有写入数据时,读端会阻塞到 read 调用,直到写端写入数据或者写端关闭。 当管道没有空间时,再写入数据就会被阻塞。直到有进程读取数据,或者所有的读端关闭。(读写顺序)

注意:全双工,指的是每一端都可读可写。前提是对端打开如果对端都关闭了,本端读数据为空,不会出错;但本段写数据肯定出错。

总结:

如果要进行顺利的管道通信:管道的两端必需都打开。

  • 管道读端关闭,写端不能写,否则会发出SIGPIPE信号,即会生成BROKEN PIPE错误。

也就是说tcp通信时,client端通过 pipe发送信息到server端后,client端挂不必,这时server端返回信息,向pipe些内容,就会出错。

 

解决方法:

  • 忽略SIGPIPE信号

    1、signal(SIGPIPE,SIG_INT);//(全局范围内)

    2、setsocketop;//(tcp特性设置)

/// sock 就是设置不发送 `SIGPIPE` 信号的 socket 变量
int value = 1;
setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));
  • 合理规避读端关闭,写端打开的问题。(避免client端关闭,server端发送数据这种情况)

   

 

tcp连接异常:brokenpipe和eof(代码片段)

本文介绍3种TCP连接异常的情况。1.server端没有启动,client尝试连接./clientdialfailed:dialtcp127.0.0.1:8080:connect:connectionrefused通过tcpdump抓包,可以看到当server没有启动的时候,client向server8080端口发送数据后,client端会收到RST。2.client端... 查看详情

通过 Beast websocket 发送连续数据块时无法找到“Broken Pipe”错误的原因

】通过Beastwebsocket发送连续数据块时无法找到“BrokenPipe”错误的原因【英文标题】:Unabletofindthereasonfor"BrokenPipe"errorwhilesendingcontinuousdatachunksthroughBeastwebsocket【发布时间】:2019-03-2913:15:57【问题描述】:我正在使用IBMWatson... 查看详情

TCP 连接错误 115 Operation in Progress 原因是啥?

】TCP连接错误115OperationinProgress原因是啥?【英文标题】:TCPConnecterror115OperationinProgressWhatistheCause?TCP连接错误115OperationinProgress原因是什么?【发布时间】:2012-04-2913:18:11【问题描述】:我的应用程序创建了一个TCP连接,这工作正... 查看详情

[转]socket使用tcp协议时,sendrecv函数解析以及tcp连接关闭的问题

Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.在阻塞模式下,send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再... 查看详情

tcp连接的状态详解以及故障排查

...以检测到打开套接字的状况3)、 sar-nSOCK查看tcp创建的连接数4)、tcpdump- 查看详情

flask中访问时后台错误error:[errno32]brokenpipe

 解决办法:app.run(threaded=True)个人理解:flask默认单线程,访问一个页面时会访问到很多页面,比如一些图片,加入参数使其为多线程 查看详情

从tcp原理角度理解brokenpipe和connectionresetbypeer的区别(代码片段)

以前我们经常会碰到Brokenpipe或者Connectionresetbypeer之类的异常,但是tcp实现里什么情况下会抛出这些异常呢,以前我给对方的回答都是模棱两可的,自己说实话都没把握,因为自己也没有验证过,对它们的认识... 查看详情

brokenpipe错误

...分钟左右,tomcat突然访问成功,同时日志输出了brokenpipe的错误:下文为参考文章,供参考:https://www.cnblogs 查看详情

brokenpipe错误

...分钟左右,tomcat突然访问成功,同时日志输出了brokenpipe的错误:下文为参考文章,供参考:https://www.cnblogs.com/metoy/p/6565486.html 查看详情

tcp三次握手,四次挥手原因

...手以下内容仅作为自己的理解三次握手为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误;本质上就是双方要连接,要等待对端同意并返回确认,一端请求后收到确认包就意味着,网络可达并且对端同意建... 查看详情

什么是tcp以及tcp与udp的区别?

UDPUDP是面向无连接的通讯协议,UDP数据包含目的端口号和源端口号信息。主要优点速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送;缺点是传输数据前并不与对方建立连接,对接收到的数据也不... 查看详情

tcp和udp的优缺点及对比

...TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。TCP的缺点: 慢,效率低,占用系统资源高,易被攻击... 查看详情

常见socket连接错误及原因都有哪些?

...eterror#10060ConnectionTimedOutsocketerrorcode:10060,socketerrorinfo:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。表示您与服务器发生联机逾时错误,请检查您的Proxy相关设定,以及ProxyServer是否已将SSL443port打... 查看详情

tcp连接的状态详解以及故障排查(代码片段)

我们通过了解TCP各个状态,可以排除和定位网络或系统故障时大有帮助。(总结网络上的内容) 1、TCP状态 了解TCP之前,先了解几个命令: linux查看tcp的状态命令:1)、netstat-nat 查看TCP各个状态的... 查看详情

tcp的协议格式以及三次握手和四次挥手(代码片段)

TCP详解目录:一.TCP协议格式二.面向连接的三次握手/四次挥手1.三次握手2.四次挥手三.TCP连接保活机制四.相关面试题理解1.为什么握手是3次,挥手是四次?2.TCP三次握手失败后会如何进行处理?3.TIME_WAIT的应用?4.一个主机上出现了大量... 查看详情

tcp的协议格式以及三次握手和四次挥手(代码片段)

TCP详解目录:一.TCP协议格式二.面向连接的三次握手/四次挥手1.三次握手2.四次挥手三.TCP连接保活机制四.相关面试题理解1.为什么握手是3次,挥手是四次?2.TCP三次握手失败后会如何进行处理?3.TIME_WAIT的应用?4.一个主机上出现了大量... 查看详情

【网络协议笔记】第四层:传输层(transport)以及upd协议简介

参考技术ATCP和UDP的区别:图片备用地址TCP是面向连接,也就是说TCP传输必须先要建立连接才能通信,建立连接就是我们熟知的“三次握手”。TCP在数据传输完毕后需要断开连接,因为服务器会有端口不断的监听本次连接的状态... 查看详情

tcp可靠传输机制

...自己下一步应该接受的序号作为确认应答返送回去。通过连接管理避免资源的无端浪费连接管理指的就是TCP连接的三次握手四次挥手。相对于UDP这种面向无连接的通信协议而言,TCP的连接管理可以事先检查对端是否存在以及对端... 查看详情