客户端断开导致服务器进程退出,其根本原因是由服务器端的 send 函数导致的。在 linux 下写 socket 的程序的时候,如果尝试 send 到一个 disconnected socket 上,就会让底层抛出一个 SIGPIPE 信号。这个信号的缺省处理方法是退出进程(send函数的flags参数设置为0),不会看到任何的提示。这里介绍两种解决方法。
方法一
将flags参数设置为 MSG_NOSIGNAL。比如
if (send(client[i], "hello", 6, MSG_NOSIGNAL) == -1)
{
perror("send");
}
这样调用,当出现客户端断开时,这里会正常调用 perror 进行报错,但是不会直接就退出。断开的客户端对应的Socket 记得要关闭掉,至于在哪里关闭就是代码设计时候需要考虑的问题了。
方法二
可以尝试重新定义这个信号的处理方式,使用如下
void signal_func()
{
}
signal(SIGPIPE,signal_func);
这样程序就不会退出了。在 signal_func 函数内编写自己的处理代码。