为什么当我使用“control-c”来关闭发送对等体上的套接字时,接收对等体上的套接字继续无限接收

我是套接字编程的新手,我知道使用“control-c”关闭套接字是一个坏习惯,但为什么接收对等体上的套接字在我使用“control-c”关闭发送过程后仍然无限接收? 在“control-c”退出进程后,不应该关闭发送对等体上的套接字吗? 谢谢!

我知道使用“control-c”关闭套接字是一个坏习惯

这关闭了整个过程,而不仅仅是一个套接字。

为什么接收对等体上的套接字在我使用“control-c”关闭发送过程后仍然无限接收?

猜测,如果没有看到你应该在你的问题中发布的代码,这是可能的,你在调用recv().时忽略错误和流结束recv().

在“control-c”退出进程后,不应该关闭发送对等体上的套接字吗?

它是。 整个过程“关闭”,包括其所有资源。

关于接收套接字,由您来检测它应该关闭的条件,并将其关闭。

没有给出代码,但这里有一个有根据的猜测可能会发生什么:

  1. 您有两个独立的代码运行:发送和接收
  2. 使用CTL + C杀死发送套接字时,您正在传输数据。
  3. 您希望接收套接字停止,但它不会。

这个问题可能是“终止传播”协议之一。 如果发送代码在您按下CTL + C时触发文件结束(EOF)(或中止或终止),则接收套接字应该看到并退出接收。 但是,您没有说明在您点击CTL + C时发送代码正在执行的操作。

接收套接字可能只是在等待更多数据; 就接收代码而言,在转移完成时会被告知,并且耐心地等待更多信息。

有比我更好的套接字程序员,但我认为可以肯定地说,一旦你达到这个水平,你应该注意传输协议的细节。 如果CTL + C只是终止服务器(发送)代码,那么客户端不知道是否存在真正的终止,传输中的意外延迟,或者服务器进程只是有一个脑屁并且一旦发生事情就会再次开始发送清理。

如果您有任何监控实际值的方法,请查看在“正常”终止数据传输和CTL + C终止期间发生的情况。 这可能有助于您了解不良行为。