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