确定TCP套接字的状态

3
我开始学习如何在Windows和Linux上实现C++ TCP服务器/客户端。目前,我正在实现服务器(并使用telnet作为客户端进行测试)。服务器应用程序可以轻松地发送和接收数据(在了解所有服务器端之后,我将实现客户端)。但是,我需要找到一种以编程方式(C ++或操作系统API)查询TCP套接字状态(如ESTABLISHED、FIN_WAIT_2、CLOSE_WAIT等)的方法,而不必使用write()/ recv()来处理错误异常。
例如:
1. 服务器启动,绑定套接字并等待连接 2. 客户端启动并连接到服务器 3. 在此处,我在服务器上有一个循环,使用功能“ioctlsocket(socket, FIONREAD, pbytes_available)”来确定何时有可读数据。 4. 如果客户端发送一些数据,则“pbytes_available”将大于1,服务器使用recv()获取数据。 5. 如果客户端没有发送任何内容,则服务器可以执行其他任务,并在下一次循环时检查套接字中是否有数据。 6. 如果我关闭TELNET(客户端进程)并运行“netstat”,则会看到服务器套接字处于“CLOSE_WAIT”状态,因此我需要在服务器端关闭套接字。。
这是问题:如何查询TCP套接字状态以确定需要关闭此会话?(不使用send()/recv(),就像“netstat”所做的那样)
注意:我尝试过“getsockopt(socket, SOL_SOCKET, SO_ERROR, &optval, &optlen )”,但当状态为ESTABLISHED/CLOSE_WAIT时,它返回0,并且“optval”也没有变化。

1
你想使用select()来查找要读取的数据和异常。请注意,并非所有操作系统都会告诉您套接字进程的另一端何时离开。 - brian beuning
我想要的是获取状态(例如:CLOSE_WAIT),就像NETSTAT一样可以做到... - user2538743
通常的BSD套接字API不公开那些信息。 Netstat必须使用某些特定于操作系统的方法来获取信息。 - brian beuning
你混淆了套接字的状态和端口的状态。套接字要么绑定,要么未绑定,连接或未连接。当它连接时,它也被绑定。连接是处于上行、半关闭或关闭状态是完全不同的问题。 - user207421
1个回答

1
通常使用阻塞模式套接字的技术是将一个线程专门用于读取套接字。当recv()返回0时,意味着对等方已关闭连接,端口现在处于CLOSE_WAIT状态。
或者,您可以使用select()等函数告诉您何时可以读取套接字,其中包括recv()返回零的情况。使用FIONREAD作为轮询机制真的没什么用处,因为它不能涵盖这种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接