Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 套接字:当服务器关闭时,客户端退出而不返回_Sockets_Tcp_Send_Recv - Fatal编程技术网

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

Sockets 套接字:当服务器关闭时,客户端退出而不返回,sockets,tcp,send,recv,Sockets,Tcp,Send,Recv,我正在创建一个简单的客户端/服务器TCP通信流,我的问题是,当我关闭服务器应用程序时,客户端应用程序只是优雅地退出。没有输出到STDERR,并且recv()不返回0或-1,客户端应用程序只是停止 另一方面,如果我杀死客户端应用程序,服务器应用程序将从send()获得0的返回值,这是预期的 在此问题上的任何帮助都将不胜感激 这可能是由于SIGPIPE被引发,这将在尝试写入另一端已关闭的连接时发生。默认情况下,SIGPIPE将立即终止该进程,以防止大量系统资源被浪费,从而生成毫无用处的输出。为了防止

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

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


在此问题上的任何帮助都将不胜感激

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

signal(SIGPIPE, SIG_IGN);

如果执行此操作,则发送调用应按预期运行。

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

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

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


我建议在您的流程中使用
strace
,以查看该系统调用到底发生了什么。

如果不是0或-1,recv返回什么?这有点难说是怎么回事。一方面,您说客户端“优雅地退出”,这听起来像程序终止了。但另一方面,你说它“刚刚停止”,这使它听起来像是挂在recv上。另外,关于你正在使用的IO架构的一些信息也会很有用。您使用的是阻塞IO还是非阻塞IO?如果阻塞,客户端和服务器之间的控制流是什么?如果是非阻塞的,您使用什么来检测可读写性?向我们展示“刚刚停止”的代码。