C/S 中当服务器进程崩溃的时候 SIGPIPE
程序还是https://github.com/juniperdiego/Unix-network-programming-of-mine/tree/master/tcpserv02
参考unix网络编程 5.12节
我们在serve 启动、client启动后 ,在serve上找到那个和client 交互的子进程,然后kill -9 。
用wireshark抓包
前面3个包是三次握手建立tcp连接,
第四个包是,由于我们杀死了server端的处理tcp连接的进程,关闭fd,然后调用close发送FIN包,表示,server端不在发送数据,但是可以接受数据。
第五个包是第四个包的ACK
第六、七个包忽略
第八个包,client端给serve端发送数据,
第九个包,然后client端调用read(),发现read()== 0,然后进程退出,发送FIN包。
第十、十一个包,由于serve端的进程已经退出,所以server端的kernl无法找到对应的端口号,回复给client端 RST。
另外,有关SIGPIPE:
连接建立,若某一端关闭连接,而另一端仍然向它写数据,第一次写数据后会收到RST响应,此后再写数据,内核将向进程发出SIGPIPE信号,通知进程此连接已经断开。而SIGPIPE信号的默认处理是终止程序,