Socket编程,"CLOSE_WAIT"、"FIN_WAIT_2"、"LISTENING"呢?
Socket programming, what about "CLOSE_WAIT", "FIN_WAIT_2" and "LISTENING"?
我正在编写一个基于套接字的 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" 结果的含义,这对套接字处理可能意味着什么,我可以做什么才能 return 给出第一个结果的情况?
谢谢
来自 Microsoft 的支持网站:
FIN_WAIT_2 Indicates that the client just received acknowledgment of the first FIN signal from the server
LISTENING Indicates that the server is ready to accept a connection
CLOSE_WAIT Indicates that the server has received the first FIN signal from the client and the connection is in the process of being
closed
根据以上,你知道在你的第一种情况下,服务器已经收到了客户端的FIN,并且客户端已经收到了向服务器发送FIN的ACK。
但是,在第二种情况下,服务器已准备好接受连接,这对我来说听起来像是您尚未建立 TCP 连接。
在不真正了解您的 C 程序试图做什么的情况下,很难在这里诊断您的问题,但我会查看 netstat 的文档并从那里开始。
FIN_WAIT2
Connection is closed, and the socket is waiting for a shutdown from the remote end.
CLOSE_WAIT
The remote end has shut down, waiting for the socket to close.
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");
}
}
亲切的问候
我正在编写一个基于套接字的 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" 结果的含义,这对套接字处理可能意味着什么,我可以做什么才能 return 给出第一个结果的情况?
谢谢
来自 Microsoft 的支持网站:
FIN_WAIT_2 Indicates that the client just received acknowledgment of the first FIN signal from the server
LISTENING Indicates that the server is ready to accept a connection
CLOSE_WAIT Indicates that the server has received the first FIN signal from the client and the connection is in the process of being closed
根据以上,你知道在你的第一种情况下,服务器已经收到了客户端的FIN,并且客户端已经收到了向服务器发送FIN的ACK。
但是,在第二种情况下,服务器已准备好接受连接,这对我来说听起来像是您尚未建立 TCP 连接。
在不真正了解您的 C 程序试图做什么的情况下,很难在这里诊断您的问题,但我会查看 netstat 的文档并从那里开始。
FIN_WAIT2 Connection is closed, and the socket is waiting for a shutdown from the remote end.
CLOSE_WAIT The remote end has shut down, waiting for the socket to close.
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");
}
}
亲切的问候