深圳网站排名怎么做,wordpress怎么做响应式网站,网站建设需要注意些什么,课程网站建设规划问题描述#xff1a;今天写程序#xff0c;socket后send出现这个问题#xff0c;send的返回值为-1#xff0c;而errno为32#xff0c;这个错误代码为broken pipe#xff0c;即管道破裂。 问题形成原因#xff1a;后来通过排查研究#xff0c;发现出现该种问题出现的可能…问题描述今天写程序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 版权声明本文为博主原创文章转载请附上博文链接