gpt4 book ai didi

c++ - 确定 TCP 套接字的状态

转载 作者:可可西里 更新时间:2023-11-01 02:42:50 25 4
gpt4 key购买 nike

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

例如:

  1. 服务器启动,绑定(bind)套接字并等待连接
  2. 客户端启动并连接到服务器
  3. 在这里,我在服务器上有一个循环,它使用函数“ioctlsocket(socket, FIONREAD, pbytes_available)”来确定何时有数据要读取..
  4. 如果客户端发送一些数据,那么“pbytes_available”将大于 1,服务器使用 recv() 获取。
  5. 如果客户端没有发送任何东西,那么服务器可以做其他的任务,并在下一个循环检查套接字上是否有数据。
  6. 如果我关闭 TELNET(客户端进程)并运行“netstat”,我将看到服务器套接字处于“CLOSE_WAIT”状态,因此我需要关闭服务器端的套接字..<

问题是:我如何查询 TCP 套接字状态以确定我需要关闭此 session ? (不使用 send()/recv(),就像“netstat”一样)

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

最佳答案

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

或者,您可以使用 select() 和 friend 来告诉您套接字何时可读,其中包括 recv() 将返回零的情况。使用 FIONREAD 作为轮询机制确实非常无用,因为它没有涵盖这种情况。

关于c++ - 确定 TCP 套接字的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21081172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com