现象:发现调用send函数时,如果远端的socket异常中断的时候,会导致send异常,并退出,这是不允许的。
原因:是网络异常的时候,linux下TCP/IP socket套接字建立后,实际上客户端与服务器端通讯是全双工,即客户端与服务器端通信各使用一个信道,而当一端关闭了信道,实际上另一边的信道是不会关闭,仍可以向里面写数据,而此时,会产生一个信号SIGPIPE,对信号的默认处理方式是:关闭当前进程。
解决办法:最简单的办法:禁用这个信号,也就是调用send的时候,使用MSG_NOSIGNAL标志,例如:
if (send(comm->comm_fd, DatInf, DatLen, MSG_NOSIGNAL) <= 0) {
printf("发送失败\r\n");
}