确定TCP套接字的状态

时间:2014-01-12 22:36:37

标签: c++ api tcp network-programming

我开始学习如何在C ++中实现TCP服务器/客户端(在Windows和Linux上)。 此时,我正在实现服务器(并使用telnet作为客户端进行测试)。 服务器应用程序正在发送和接收数据,如魅力..(我将了解所有服务器端后实现客户端)。 但我需要找到一种编程(C ++或OS API)方式来查询TCP套接字状态(ESTABLISHED,FIN_WAIT_2,CLOSE_WAIT等)而不使用write()/ recv()来处理错误异常..

例如:

  1. 服务器启动,绑定套接字并等待连接
  2. 客户端在服务器上启动并连接
  3. 这里,我在服务器上有一个循环,它使用func“ioctlsocket(socket,FIONREAD,pbytes_available)”来确定何时有数据要读取..
  4. 如果客户端发送一些数据,那么“pbytes_available”将是> 1,服务器使用recv()来获取。
  5. 如果客户端没有发送任何内容,那么服务器可以执行其他任务并检查下一次循环中是否有套接字数据。
  6. 如果我关闭TELNET(客户端进程)并运行“netstat”,我会看到服务器套接字处于“CLOSE_WAIT”状态,所以我需要关闭服务器端的套接字..
  7. 这就是问题:如何查询TCP套接字状态以确定我需要关闭此会话? (不使用send()/ recv(),如“netstat”do)

    注意:我尝试了“getsockopt(套接字,SOL_SOCKET,SO_ERROR,& optval,& optlen)”,但是当状态为ESTABLISHED / CLOSE_WAIT并且“optval”时它返回0也没有变化。

1 个答案:

答案 0 :(得分:1)

阻塞模式套接字的常用技术是专用线程来读取套接字。当recv()返回0时,表示对等方已关闭连接,端口现在处于CLOSE_WAIT状态。

或者,您可以使用select()和朋友告诉您套接字何时可读,其中包括recv()将返回零的情况。使用FIONREAD作为轮询机制实际上是无用的,因为它不包括这种情况。