2

我写了一个套接字服务器,在 linux 上运行,但这可能不是 linux 规范。

poll()用来检查客户的状态。我的客户在发送请求后会主动(半)关闭。由于客户端的半关闭,服务器不断获取POLLHUP和。POLLERR我也看到POLLRDHUP了,所以我知道这实际上是半关闭而不是连接关闭/重置。我的问题是我总是会收到这些事件,即使我已经从之前的民意调查中知道有一半接近。

我怎样才能禁用它,这样我就不再收到 thisis 事件了?我试图做额外的事情read()并做一个shutdown(fd, SHUT_RD),但它似乎没有帮助。我不想poll因为我已经处理过的事件而醒来。

4

2 回答 2

3

一旦接近一半,就停止将 fd 包含在 readfds 集中。除了半关闭,没有什么可读的了。从这一点开始,您唯一感兴趣的就是“可写”事件。

于 2011-07-08T01:20:23.363 回答
0

只需忽略POLLHUP返回标志。如果正确,现有代码将执行您想要的操作。

您将不断获得半关闭的事实poll()(由 EJP 的回答概述)是一个功能,而不是一个错误。它使您可以像对待文件结尾一样对待半封闭;这正是您想要的,就像它让您的应用程序读取套接字缓冲区中的最后一个字节而不是丢弃它们(这是 TCP 半关闭的正确语义)。

一旦达到“普通”文件结尾,poll()将始终选择文件描述符作为准备读取。poll()然后应该对数据进行循环,read()直到看到文件结尾,然后close(). 忽略该POLLHUP条件可以让您的程序在半关闭的情况下使用相同的代码执行完全相同的操作,并获取套接字缓冲区中的最后一个字节。

同样,您应该在不关心POLLHUP. 如果(且仅当)您需要限制文件描述符(即当前无处可放入read()字节),则从poll()集合中删除该描述符,这样内核就不会因为“准备好读取”而困扰您中断”,直到你再次告诉它(不节流)。所有数据都已经在套接字缓冲区中(这是该POLLHUP位所指示的)这一事实再次没有任何区别。

于 2013-09-10T16:00:33.230 回答