我正在制作一个简单的客户端/服务器TCP通信流,我的问题是,当我杀死服务器应用程序时,客户端应用程序只是优雅地退出。没有输出到STDERR,并且recv()不返回0或-1,客户端应用程序只是停止。
另一方面,如果我终止客户端应用程序,服务器应用程序会从send()获得返回值0,这是预期的。
非常感谢您对此问题的任何帮助!
答案 0 :(得分:0)
这可能是由于SIGPIPE
被引发,这将在尝试写入已被另一端关闭的连接时发生。默认情况下,SIGPIPE
将立即终止进程,以防止浪费大量系统资源生成无处可用的输出。为防止这种情况,您可以忽略信号:
signal(SIGPIPE, SIG_IGN);
如果您这样做,send
来电应按预期运行。
答案 1 :(得分:0)
当您终止客户端应用程序时,操作系统会关闭其所有打开的IO句柄。以这种方式关闭TCP连接时,它会向其对等方发送FIN。在这方面,让你的客户被杀是无法区分的,让它优雅地退出。
建立TCP连接后,就没有“客户端”和“服务器”的概念;这是一个简单的双向沟通渠道。从网络/套接字的角度来看,无论哪一方被中止,结果都是相同的。
如果您看到行为上的差异,那么它就是两个应用程序的编程。阻塞recv()
调用应返回连接关闭时可用的字节数,或者错误可能为-1。
我建议您在流程中使用strace <client program and args>
来查看该系统调用的具体信息。