标签:top splay soc TE 退出 bsp 生成 打开 play
问题:
写了一个server和一个client,UNIX套接字的,server不断接收消息并打印出来,client是一个交互程序,输入一个消息回车发送,接着又可以输入消息。
出问题了:
当server监听着,client第一次发送消息成功,server接收并打印出来了。
client第二次发送消息没成功并且结束程序了,server没接收到消息,保持继续监听。
我用GDB调试时,发现client第二次发送消息时,client收到SIGPIPE(Broken Pipe)信号。server明明还监听着,而且再次启动client还是第一次成功,第二次失败退出。
分析:
TCP协议是端到端的传输控制协议,之所以是“端到端”的协议,是因为”路由“是由IP协议负责的,TCP协议负责为两个通信端点提供可靠性保证,这个可靠性不是指一个端点发送的数据,另一个端点肯定能收到(这显然是不可能的),而是指,数据的可靠投递或者故障的可靠通知。
所谓的“端到端”,指的是在通信两端之间建立了一个全双工的通信管道,既然是管道,就不得不了解管道。
管道的特点:
管道特性的表现:
注意:全双工,指的是每一端都可读可写。前提是对端打开。如果对端都关闭了,本端读数据为空,不会出错;但本段写数据肯定出错。
总结:
如果要进行顺利的管道通信:管道的两端必需都打开。
也就是说tcp通信时,client端通过 pipe发送信息到server端后,client端挂不必,这时server端返回信息,向pipe些内容,就会出错。
解决方法:
1、signal(SIGPIPE,SIG_INT);//(全局范围内)
2、setsocketop;//(tcp特性设置)
/// sock 就是设置不发送 `SIGPIPE` 信号的 socket 变量
int value = 1;
setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));
标签:top splay soc TE 退出 bsp 生成 打开 play
原文地址:https://www.cnblogs.com/cthon/p/9139553.html