套接字:当服务器关闭时,客户端退出而不返回任何内容

时间:2011-06-13 19:54:14

标签: sockets tcp send recv

我正在制作一个简单的客户端/服务器TCP通信流,我的问题是,当我杀死服务器应用程序时,客户端应用程序只是优雅地退出。没有输出到STDERR,并且recv()不返回0或-1,客户端应用程序只是停止。

另一方面,如果我终止客户端应用程序,服务器应用程序会从send()获得返回值0,这是预期的。

非常感谢您对此问题的任何帮助!

2 个答案:

答案 0 :(得分:0)

这可能是由于SIGPIPE被引发,这将在尝试写入已被另一端关闭的连接时发生。默认情况下,SIGPIPE将立即终止进程,以防止浪费大量系统资源生成无处可用的输出。为防止这种情况,您可以忽略信号:

signal(SIGPIPE, SIG_IGN);

如果您这样做,send来电应按预期运行。

答案 1 :(得分:0)

当您终止客户端应用程序时,操作系统会关闭其所有打开的IO句柄。以这种方式关闭TCP连接时,它会向其对等方发送FIN。在这方面,让你的客户被杀是无法区分的,让它优雅地退出。

建立TCP连接后,就没有“客户端”和“服务器”的概念;这是一个简单的双向沟通​​渠道。从网络/套接字的角度来看,无论哪一方被中止,结果都是相同的。

如果您看到行为上的差异,那么它就是两个应用程序的编程。阻塞recv()调用应返回连接关闭时可用的字节数,或者错误可能为-1。

我建议您在流程中使用strace <client program and args>来查看该系统调用的具体信息。