Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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

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
C 是否保证在进程终止时发送RST数据包?_C_Sockets_Winapi_Network Programming_Winsock - Fatal编程技术网

C 是否保证在进程终止时发送RST数据包?

C 是否保证在进程终止时发送RST数据包?,c,sockets,winapi,network-programming,winsock,C,Sockets,Winapi,Network Programming,Winsock,如果我有一个连接了套接字的进程,并且我终止了这个进程,那么Windows将导致发送RST数据包 是否可以保证(是否有文档记录)在进程终止时始终发送RST数据包,或者可以改为发送FIN数据包?TCP不应该在连接关闭时发送RST数据包。要关闭连接,TCP在客户端会经历以下状态: 发送一个FIN包。此操作将TCP状态更改为FIN\u WAIT\u 1 在FIN_WAIT_1中,TCP等待来自服务器的确认(ACK) 收到确认后,TCP进入FIN\u WAIT\u 2 在FIN\u WAIT\u 2中,T

如果我有一个连接了套接字的进程,并且我终止了这个进程,那么Windows将导致发送RST数据包


是否可以保证(是否有文档记录)在进程终止时始终发送RST数据包,或者可以改为发送FIN数据包?

TCP不应该在连接关闭时发送RST数据包。要关闭连接,TCP在客户端会经历以下状态:

  • 发送一个FIN包。此操作将TCP状态更改为
    FIN\u WAIT\u 1
  • FIN_WAIT_1
    中,TCP等待来自服务器的确认(ACK)
  • 收到确认后,TCP进入
    FIN\u WAIT\u 2
  • FIN\u WAIT\u 2
    中,TCP等待来自服务器的
    FIN
    数据包
  • 一旦
    FIN
    到达,客户端发送
    ACK
    并输入
    TIME\u WAIT
  • TIME\u WAIT
    在一段时间后退出(通常为30秒或1分钟)。此状态的目的是使最终的
    ACK
    能够在丢失时重新发送到服务器
    任何地方都没有RST数据包。RST用于响应意外流量,用于关闭连接


    例如,如果您将TCP数据包发送到端口80,而服务器没有运行HTTP服务器(并且假设数据包一直到服务器,并且没有被阻止/忽略),则会将RST回复发送回客户端。

    RST是对“未经请求”流量的响应。此流量用于现在不存在的进程。TCP堆栈将以RST响应此类流量。由于进程终止,它不会“启动”RST。对于Windows将导致发送RST数据包的说法,您是否有引用?如果远程服务器断电,您将得到什么数据包?或者如果反铲切断了互联网连接?@David Schwartz我在Wireshark中捕获了RST数据包。但我不确定是否总是这样(这就是我为什么要问的原因!)。请注意,当我终止进程时,发送缓冲区是空的(与我在别处读到的不同,如果发送缓冲区不是空的,那么将发送RST数据包)。CLOSE_WAIT没有超时。你想的是等待的时间。非常困惑,而且大部分是不相关的。@EJP是的,你是对的。我更新了答案。老实说,我不认为这会让整个答案“非常混乱”,而且最肯定的是,这并不是无关紧要的。显然,OP不知道TCP连接是如何关闭的,一个简单的是/否答案几乎没有用处。充其量,一句评论就足够了——在我看来,否决票是完全没有必要的。你真的认为这个答案没有用吗?嗯。看起来它描述了一个优雅的套接字关闭。如果我没记错的话,非正常关机不是有些不同吗?@HarryJohnston是的,它是不同的,取决于接收端发生了什么。如果接收进程崩溃或因任何原因被终止,
    send()
    将返回
    ECONNRESET
    。在网络级别,要么接收方使用
    RST
    数据包进行回复(如果主机仍处于活动状态),要么根本不回复。“RST用于响应意外流量,而不是关闭连接”当发送RST数据包以响应关闭进程时,发送该数据包是为了告诉另一端我已离开,如果没有发送RST数据包,则另一端仍会认为它已连接到我。