0

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

我发现这篇关于堆栈溢出的帖子:

select(设置了读取掩码)将返回带有信号的句柄,但是当您使用 ioctl* 检查待读取的字节数时,它将为零。`

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

4

2 回答 2

3

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

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

于 2012-12-11T13:20:52.577 回答
3

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

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

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

于 2012-12-11T13:28:10.927 回答