首页 文章

确定TCP套接字的状态

提问于
浏览
2

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

例如:

  • 服务器启动,绑定套接字并等待连接

  • 客户端在服务器上启动并连接

  • 这里,我在服务器上有一个循环,它使用func "ioctlsocket(socket, FIONREAD, pbytes_available)"确定何时有数据要读取..

  • 如果客户端发送一些数据,则"pbytes_available"将> 1,服务器使用recv()来获取 .

  • 如果客户端没有发送任何内容,那么服务器可以执行其他任务并检查下一个循环中的套接字上是否有数据 .

  • 如果我关闭TELNET(客户端进程)并运行"netstat",我会看到服务器套接字处于"CLOSE_WAIT"状态,所以我需要关闭服务器端的套接字..

And this is the question: 如何查询TCP套接字状态以确定我需要关闭此会话? (不使用send()/ recv(),就像"netstat"一样)

Note: 我尝试了"getsockopt(socket, SOL_SOCKET, SO_ERROR, &optval, &optlen )",但是当状态为ESTABLISHED / CLOSE_WAIT并且"optval"也没有改变时它返回0 .

1 回答

  • 1

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

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

相关问题