问题:网络
写了一个server和一个client,UNIX套接字的,server不断接收消息并打印出来,client是一个交互程序,输入一个消息回车发送,接着又能够输入消息。
出问题了:
当server监听着,client第一次发送消息成功,server接收并打印出来了。
client第二次发送消息没成功而且结束程序了,server没接收到消息,保持继续监听。
我用GDB调试时,发现client第二次发送消息时,client收到SIGPIPE(Broken Pipe)信号。server明明还监听着,并且再次启动client仍是第一次成功,第二次失败退出。socket
一样的,当client由于断开(关闭了网络描述符sfd,或者ctrl+c/ctrl+\异常断开),server端也产生SIGPIPE信号。tcp
分析:spa
TCP协议是端到端的传输控制协议,之因此是“端到端”的协议,是由于”路由“是由IP协议负责的,TCP协议负责为两个通讯端点提供可靠性保证,这个可靠性不是指一个端点发送的数据,另外一个端点确定能收到(这显然是不可能的),而是指,数据的可靠投递或者故障的可靠通知。调试
所谓的“端到端”,指的是在通讯两端之间创建了一个全双工的通讯管道,既然是管道,就不得不了解管道。server
管道的特色:blog
管道特性的表现:进程
注意:全双工,指的是每一端均可读可写。前提是对端打开。若是对端都关闭了,本端读数据为空,不会出错;但本段写数据确定出错。ip
总结:内存
若是要进行顺利的管道通讯:管道的两端必需都打开。
也就是说tcp通讯时,client端经过 pipe发送信息到server端后,client端挂没必要,这时server端返回信息,向pipe些内容,就会出错。
解决方法:
一、signal(SIGPIPE,SIG_INT);//(全局范围内)
二、setsocketop;//(tcp特性设置)
/// sock 就是设置不发送 `SIGPIPE` 信号的 socket 变量
int value = 1;
setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));