gdb调试有TCP协议的程序时出现:Program received signal SIGPIPE,Broken pipe.

管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到SIGPIPE信号。此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。

****在做一个WEB服务器项目的时候,程序基本功能已经实现,但是在windows上使用Chrome浏览器访问时,正常运行一段时间后,服务端的程序异常结束,调试了一早上,没有找到问题,使用gdb找到了错误管道破裂,然后在错误的地方发现了一个共同点,都有conn这个参数,但是看不懂错误的意思,想不到socket套接字出现了问题。发现是浏览器的问题,浏览器的套接字关闭了,但是服务器还在往套接字发文件,导致管道破裂,服务端进程结束。

解决方法:是忽略SIGPIPE信号(使用信号处理函数,handler函数什么也不执行),然后判断send的返回值,如果返回-1,表示发送失败,重新连接(即结束这个被调函数(return 1),程序会进入下一次while循环,因为没有发送(写端)时,浏览器(客户端)并不会关闭,只会不断发送申请报文,等待服务端的响应报文(文件));****

我们需要在send的时候检测到服务器已经关闭连接,进行重新连接。正常情况下send函数返回-1表示发送失败,但是在IOS上SIGPIPE在send返回之前就终止了进程,所以我们需要忽略SIGPIPE,让send正常返回-1,然后重新连接服务器。

参考:https://blog.csdn.net/jia12216/article/details/50844013?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161199114916780262545837%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161199114916780262545837&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-50844013.pc_search_result_before_js&utm_term=%25E5%25BF%25BD%25E7%2595%25A5%25E5%25A5%2597%25E6%258E%25A5%25E5%25AD%2597%25E7%259A%2584%25E7%25AE%25A1%25E9%2581%2593%25E7%25A0%25B4%25E8%25A3%2582

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值