Sockets Socket编程,那么“Socket”呢;关闭“等待”&引用;FIN“等待2”;及;倾听;?

Sockets Socket编程,那么“Socket”呢;关闭“等待”&引用;FIN“等待2”;及;倾听;?,sockets,tcp,netstat,Sockets,Tcp,Netstat,我正在编写一个基于套接字的C应用程序,它的行为似乎非常不稳定。 该代码是TCP端口6683上的标准套接字处理,我知道它以前工作过。我认为最有趣的不是源代码,而是netstat-aon命令的结果: 当它工作正常时,netstat-aon | grep6683命令的结果是: TCP 127.0.0.1:6683 127.0.0.1:50888 CLOSE_WAIT 6128 TCP 127.0.0.1:50888 127.0.0.1:

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

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

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 | grep6683
命令的结果如下:

TCP    127.0.0.1:6683         0.0.0.0:0              LISTENING       7800
有人知道提到的“netstat”结果的含义吗?这对套接字处理意味着什么?为了返回到给出第一个结果的情况,我可以做些什么


感谢微软的技术支持网站:

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

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

CLOSE\u WAIT表示服务器已从客户端接收到第一个FIN信号,并且连接正在进行中 封闭的

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

然而,在第二种情况下,服务器已经准备好接受一个连接,在我看来,您似乎还没有建立TCP连接


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

来自Microsoft的支持网站:

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

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

CLOSE\u WAIT表示服务器已从客户端接收到第一个FIN信号,并且连接正在进行中 封闭的

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

然而,在第二种情况下,服务器已经准备好接受一个连接,在我看来,您似乎还没有建立TCP连接

如果不知道您的C程序正在尝试做什么,很难在这里诊断您的问题,但我会查看文档并从那里开始。

来自:

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

关闭\u等待 远端已关闭,等待套接字关闭

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

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

来自:

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

关闭\u等待 远端已关闭,等待套接字关闭

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


您可以看到,带有
FIN_WAIT 2
的一侧已关闭并等待另一侧,而带有
CLOSE_WAIT
的一侧当前正在关闭,但尚未关闭。基于
侦听
套接字,客户端关闭,当前关闭的端是服务器。服务器可能正在等待,因为有尚未读取的数据。它无法在不丢失数据的情况下关闭套接字,这对于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\u value=CreateProcess(NULL,buf,NULL,NULL,FALSE,
dwCreationFlags、NULL、NULL、sin和pin);
if(返回值=0){
printf(“client_process.exe尚未成功启动。\n”);
word error_return_value=GetLastError();
printf(“对应的错误值为:[%d]\n”,错误返回值);
如果(错误)