套接字编程,"CLOSE_WAIT"、"FIN_WAIT_2"和"LISTENING"呢?

Socket programming, what about "CLOSE_WAIT", "FIN_WAIT_2" and "LISTENING"?

本文关键字:WAIT LISTENING FIN CLOSE 编程 套接字      更新时间:2023-10-16

我正在编写一个基于套接字的C应用程序,它的行为似乎非常不稳定。该代码是TCP端口6683上的标准套接字处理,我知道它以前已经起作用了。与其提到源代码,我相信最有趣的是 netstat -aon 命令的结果:

当它工作正常时,netstat -aon| grep 6683命令的结果是:

TCP    127.0.0.1:6683         127.0.0.1:50888        CLOSE_WAIT      6128
TCP    127.0.0.1:50888        127.0.0.1:6683         FIN_WAIT_2      3764

当它不再工作时,netstat -aon | grep 6683命令的结果是:

TCP    127.0.0.1:6683         0.0.0.0:0              LISTENING       7800

有谁知道提到的"netstat"结果的含义,这对套接字处理可能意味着什么,以及我可以做些什么才能回到给出第一个结果的情况?

谢谢

来自Microsoft的支持网站:

FIN_WAIT_2 表示客户端刚刚收到来自服务器的第一个 FIN 信号的确认

正在侦听 表示服务器已准备好接受连接

CLOSE_WAIT 表示服务器已从客户端接收到第一个 FIN 信号,并且连接正在 闭

基于上述内容,您知道在第一种情况下,服务器已收到客户端的 FIN,并且客户端已收到将 FIN 发送到服务器的 ACK。

但是,在第二种情况下,服务器已准备好接受连接,对我来说,这听起来像您尚未建立TCP连接。

在不知道您的 C 程序试图做什么的情况下,很难在这里诊断您的问题,但我会查看 netstat 的文档并从那里开始。

来自 netstat 文档

FIN_WAIT2 连接已关闭,套接字正在等待从远程端关闭。

CLOSE_WAIT 远程端已关闭,等待套接字关闭。

LISTENING状态只是等待客户端的服务器套接字。这是侦听服务器套接字(与连接服务器套接字不同)的正常行为。

您可以看到,有FIN_WAIT2的一侧已关闭并等待另一侧,但具有CLOSE_WAIT的一侧当前正在关闭,但尚未关闭。基于LISTENING套接字,客户端关闭,当前关闭端是服务器。服务器可能正在等待,因为有尚未读取的数据要读取。它无法在不丢失数据的情况下关闭套接字,这对于 TCP 来说是不可接受的。读取服务器端剩余的所有数据后,连接应正常关闭。

感谢您的快速回复。同时,我发现了出了什么问题:

我的应用程序是一个服务器应用程序,创建一个客户端进程,并设置一个TCP套接字来与该客户端进程进行通信(这是使用C命令完成的:

snprintf(buf, 1024, "client_process.exe %s %d", szListenHost, iListenPort);
CreateProcess(NULL, buf, NULL, NULL, FALSE, dwCreationFlags,
              NULL, NULL, &sin, &pin);
有时

这很好,有时不行,这取决于我启动服务器进程的位置:当我从官方目录启动它时,它工作正常。当我从开发环境中启动它时,它不起作用。原因很简单:在我的开发环境中,当前目录中不存在"client_process.exe"文件。

我现在已将"client_process.exe"复制到该目录中并添加了一个额外的检查:

int return_value = CreateProcess(NULL, buf, NULL, NULL, FALSE, 
                                 dwCreationFlags, NULL, NULL, &sin, &pin);
if (return_value == 0) {
  printf("The client_process.exe has not been started successfully.n");
  word error_return_value = GetLastError();
  printf("The corresponding error value is:[%d]n", error_return_value);
  if (error_return_value == 2) {
    printf("The client_process.exe is not present in the current directory.n"); 
  }
}

亲切问候