0

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

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

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

4

2 回答 2

0

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

signal(SIGPIPE, SIG_IGN);

如果您这样做,send呼叫应该按预期运行。

于 2011-06-13T22:16:07.617 回答
0

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

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

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

我建议strace <client program and args>在您的进程中使用以查看该系统调用到底发生了什么。

于 2011-06-15T09:40:17.637 回答