seo 发表于 2022-5-31 13:31:26

Linux下send错误代码32

Linux下send错误代码32发布时间:2022/5/31 13:11:14
            
                                                       
                                                       
            
      
      
               
                  问题描述:今天写程序,socket后send出现这个问题,send的返回值为-1,而errno为32,这个错误代码为broken pipe,即管道破裂。





问题形成原因:后来通过排查研究,发现出现该种问题出现的可能性为以下两种:

1.socket失败,与服务器端的链接没有成功,从而管道破裂。

2.服务端将客户端的socket断开,一样造成这样的问题。





此时这样的程序收到broken pipe的信号,会自动退出我们可以在产生信号前利用方法 signal(int signum, sighandler_t handler) 设置信号的处理。如果没有调用此方法,系统就会调用默认处理方法:中止程序,显示提示信息(就是我们经常遇到的问题)。我们可以调用系统的处理方法,也可以自定义处理方法。

对一个已经收到FIN包的socket调用read方法, 如果接收缓冲已空, 则返回0,
这就是常说的表示连接关闭. 但第一次对其调用write方法时, 如果发送缓冲没问题,
会返回正确写入(发送). 但发送的报文会导致对端发送RST报文,
因为对端的socket已经调用了close, 完全关闭, 既不发送, 也不接收数据. 所以,
第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出.

为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它,
给它设置SIG_IGN信号处理函数:

signal(SIGPIPE, SIG_IGN);

这样, 第二次调用write方法时, 会返回-1, 同时errno置为SIGPIPE.
程序便能知道对端已经关闭
---------------------
作者:JimmyRuin
来源:CSDN
原文:https://blog.csdn.net/u013267687/article/details/52441460
版权声明:本文为博主原创文章,转载请附上博文链接!
               
      
      
   
            
      
      
https://www.yilongzhijia.cn/tupian/seo365t.jpg
页: [1]
查看完整版本: Linux下send错误代码32