socket send 异常
来源:互联网 发布:如何学习linux命令 编辑:程序博客网 时间:2024/05/21 15:10
使用libevent编写websocket服务端时遇到了一个问题:
浏览器与服务端建立连接后,若刷新或关闭浏览器窗口(未监听相应事件并处理),服务端无法得知连接断开,按理说,这种情况属于client异常终止,跟拔网线的情况类似。这种情况下,服务端不知情,仍保留此连接,仍按照既定逻辑向client写数据,写了两次后,服务端程序终止(多次测试,均是第2次后终止),不是崩溃,是异常终止,非常不解。
问了一位很有经验的同事,得知是SIGPIPE信号导致程序终止。
查了相关资料,大致明白:连接建立,若某一端关闭连接,而另一端仍然向它写数据,第一次写数据后会收到RST响应,此后再写数据,内核将向进程发出SIGPIPE信号,通知进程此连接已经断开。而SIGPIPE信号的默认处理是终止程序,导致上述问题的发生。
为避免这种情况,可以选择忽略SIGPIPE信号,不执行任何动作。
#include <signal.h>
//SIGPIPE ignore
struct sigaction act;
act.sa_handler = SIG_IGN;
if (sigaction(SIGPIPE, &act, NULL) == 0) {
LOG("SIGPIPE ignore");
}
0 0
- socket send 异常
- socket send block
- Socket send recv
- C# Socket.send阻塞
- Linux socket recv & send
- socket send recv
- Linux socket send file
- Linux socket recv send
- ios socket send sigpipe
- Socket.send返回12
- socket without send
- 关于socket Send 代码
- socket之send
- Send File In C Socket
- Send File In C Socket
- 同步Socket Send执行流程
- 关于socket中的send函数
- socket send 和 recv详解
- 第五题:Longest Palindromic Substring
- oracle权限问题
- poj 1463 Strategic game 树状dp
- 打开文件夹对话框用法
- codeforces 507C
- socket send 异常
- java之File对象对文件的操作常用的几个方法
- 在Tomcat上安装部署SAIKU
- iOS 图片显示原理
- 剖析 Linux hypervisor
- Codeforces 500C New Year Book Reading
- C和C++混合编程(error C2059: syntax error : 'string')
- sqlite3导入数据
- 看数据结构写代码(1) 三元组