问题描述:
客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出。
原因分析:
在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。
这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。
解决方法可以有两种:
第一种:忽略这个SIGPIPE信号,
struct sigaction sa;
sa.sa_handler = SIG_IGN;
sigaction( SIGPIPE, &sa, 0 );
第二种:修改send 函数的第四个参数, 将flags参数设置为MSG_NOSIGNAL:
res = send (client->sock_fd, ptr, sendlen, MSG_NOSIGNAL);
send 函数简介:
send() | ||
所需头文件 | #include <sys/types.h> #include <sys/socket.h> | |
函数说明 | 通过socket文件描述符发送数据到对方 | |
函数原型 | ssize_t send(int s, const void *buf, size_t len, int flags) | |
函数传入值 | s | socket文件描述符 |
buf | 发送数据的首地址 | |
len | 发送数据的长度 | |
flags | 0:此时功能同write,flags还可以设为以下标志的组合 | |
MSG_OOB:发送带外数据 | ||
MSG_DONTROUTE:告诉IP协议,目的主机在本地网络,没有必要查找路由表 | ||
MSG_DONTWAIT:设置为非阻塞操作 | ||
MSG_NOSIGNAL:表示发送动作不愿被SIGPIPE信号中断 | ||
函数返回值 | 成功:实际发送的字节数 | |
失败:-1,失败原因存于error中 |