我开始学习如何在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. 服务器启动,绑定套接字并等待连接 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”也没有变化。