c++ Socket编程,“CLOSE_WAIT”、“FIN_WAIT_2”和“LISTENING”怎么样?

okxuctiv  于 2023-05-30  发布在  其他
关注(0)|答案(3)|浏览(180)

我正在写一个基于套接字的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”结果的含义吗?这对套接字处理意味着什么?为了返回到给出第一个结果的情况,我可以做些什么?
谢谢

eufgjt7s

eufgjt7s1#

Microsoft支持网站:

FIN_WAIT_2表示客户端刚刚收到服务器第一个FIN信号的确认
LISTENING表示服务器已准备好接受连接
CLOSE_WAIT表示服务器已经收到客户端的第一个FIN信号,连接正在关闭

基于以上内容,您知道在第一个案例中,服务器已经接收到客户端的FIN,并且客户端已经通过向服务器发送FIN而接收到ACK。
然而,在第二种情况下,服务器已经准备好接受一个连接,这对我来说听起来像是你还没有建立你的TCP连接。
如果不知道你的C程序要做什么,很难在这里诊断你的问题,但我会看看netstat的文档,然后从那里开始。

5w9g7ksd

5w9g7ksd2#

关于netstat documentation

FIN_WAIT2连接关闭,套接字等待远端关机。
CLOSE_WAIT远端已关机,等待socket关闭。

LISTENING状态只是服务器套接字在等待客户端。这是侦听服务器套接字(与连接服务器套接字不同)的正常行为。
您可以看到带有FIN_WAIT2的一侧已关闭并等待另一侧,但带有CLOSE_WAIT的一侧当前正在关闭,但尚未关闭。基于LISTENING套接字,客户端是关闭的,当前关闭的端是服务器端。服务器可能正在等待,因为有尚未读取的数据要读取。它不能在不丢失数据的情况下关闭套接字,这对于TCP是不可接受的。读取完服务器端的所有数据后,连接应正常关闭。

sr4lhrrt

sr4lhrrt3#

感谢您的快速React。同时,我也发现了问题所在:
我的应用程序是一个服务器应用程序,创建一个客户端进程,并设置一个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"); 
  }
}

亲切的问候

相关问题