客户端断开连接后,C ++ TCP服务器仍在读取数据

时间:2012-12-11 11:03:33

标签: c++ c sockets select

我创建了一个使用select来检查套接字描述符中是否有数据的服务器,但显然选择标记了即使在客户端断开连接后也可以读取的套接字,并且我得到了垃圾值。

我在堆栈溢出时发现了这篇文章: select (with the read mask set) will return with the handle signalled, but when you use ioctl* to check the number of bytes pending to be read, it will be zero.

我的问题是什么是ioctl *以及如何使用它。一个例子非常好。

2 个答案:

答案 0 :(得分:3)

检查使用select(2)时人们常犯的错误:

  • 在每次迭代时始终重新初始化fd_setselect(2) - 这些是系统调用为您修改的输入输出参数。
  • 在每次迭代时重新计算fd_max,第一个参数。
  • 检查所有系统调用的错误,检查errno(3)
  • 的值

并且,是的,当另一方干净地关闭TCP连接时,read(2)返回零,不再使用该套接字,只是close(2)它。

答案 1 :(得分:2)

如果对套接字(文件)描述符的read()的调用返回0,则表示连接的另一端已关闭并关闭连接。

注意:当select()之一传递给{fd_set的连接时,等待套接字(文件)描述符集上的可能“事件”的select()也将返回1}}已关闭。