套接字编程,"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"结果的含义,这对套接字处理可能意味着什么,以及我可以做些什么才能回到给出第一个结果的情况?
谢谢
来自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");
}
}
亲切问候
- std::condition_variable::wait()如何评估给定的谓词
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- std::memory_order for std::atomic:<T>:wait
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- std::future::get()或std::future::wait()是std::thread::join()的替
- 在 while 循环中使用 std::condition_variable::wait 是否正确
- future::wait() 是否与 async() 执行线程的完成同步?
- 为什么'wait with predicate'求解条件变量的'lost wakeup'?
- 线程锁定互斥锁的速度比 std::conditional_variable::wait() 快
- deadline_timer::wait 是否让位于其他任务
- std::future::wait 是内存障碍吗?(我无法解释这种数据竞赛)
- 如何退出 QThread::wait()
- C++ winsock TCP listening
- 当Qtest :: Qwait(..)成功时,Qsignalspy :: Wait(..)失败
- 如何在Wait()C++期间同时调用另一个函数
- 条件变量的"wait"函数在提供谓词时导致意外行为
- 在 UWP 应用程序中,future.wait() 在尝试同步来自异步方法的响应时继续等待
- 条件变量wait引发异常
- 为什么 future::wait() 块