常见的编程错误会导致在epoll边缘触发模式下卡住CLOSE_WAIT?

时间:2014-05-15 00:08:18

标签: c++ linux sockets epoll

我想知道常见的编程情况/错误可能导致我进入CLOSE_WAIT而不是实际关闭套接字的服务器进程。

我想要做的是触发这种情况,以便我可以解决它。在正常的开发环境中,我无法触发它,但是在实时服务器上使用的相同代码偶尔会得到它们,以便在很多天后我们有数百个。

Google搜索close_wait,它实际上似乎是一个非常常见的问题,即使是在成熟的,据称写得很好的服务,如nginx。

1 个答案:

答案 0 :(得分:2)

CLOSE_WAIT基本上是当远程端关闭套接字但本地应用程序尚未在其上调用close()时。这通常发生在期望从套接字读取数据并且因此没有看到它的可读性时。

为方便起见,许多应用程序将始终监视套接字以便于检测关闭。

尝试的方案是:

  1. Peer发送2k数据并立即关闭数据
  2. 然后您的套接字已在epoll中注册并获得可读性通知
  3. 您的应用程序只读取1k数据
  4. 您停止监视套接字的可读性
  5. (我不确定边缘触发的epoll是否会最终将关闭事件作为单独的事件发送)。
  6. 另见:

    (来自man epoll_ctl

      

    EPOLLRDHUP(自Linux 2.6.17起)             流套接字对等关闭连接,或关闭写入一半的连接。 (此标志对写入特别有用   简单的代码             在使用边缘触发监视时检测对等关闭。)