【问题标题】:Detect idle connection in non-blocking socket检测非阻塞套接字中的空闲连接
【发布时间】:2019-01-18 04:54:48
【问题描述】:

我正在编写一个使用非阻塞套接字和 epoll() 进行 I/O 多路复用的 TCP 服务器。我想检测空闲连接以便关闭它们。我不能将 setsockopt 与 RCVTIMEO 一起使用,因为套接字不会阻塞。我们如何在非阻塞套接字上设置超时? 这与我的另一个问题有关:Time out idle connections in epoll based server 如果双重发布请告诉我,我将删除此问题或其他问题。

【问题讨论】:

    标签: c sockets linux-kernel network-programming nonblocking


    【解决方案1】:

    在您的插座上使用计时器。您使用的事件循环库应提供计时器。

    或者,您可以设置一个全局计时器,例如每分钟触发一次。在此计时器回调中,您检查每个客户端连接的最后活动时间并断开一段时间未活动的连接。

    【讨论】:

    • 我正在这样做,我保留了一个与每个连接关联的 last_active time_t 变量,我将其更新为事件处理程序中的当前时间。在此之前,我检查自上次事件以来是否超过了允许的时间,如果是,我终止连接。这不是我真正想要的,因为超时仅在第一个超时事件上触发,但如果连接保持非活动状态,我的代码不会检测到它,直到它再次变为“活动”。我是直接用epoll,没用任何事件库。
    • @miguel 这不是你描述的计时器。您使用的计时器必须在到期时调用您的回调。
    • @miguel 对epoll 使用超时参数。跟踪当前时间。一旦经过足够的时间,就会进行死客户端检测。我打算建议使用libevent
    • 如果所有超时值都相同,则不需要优先级队列。新的超时将始终在队列的开头,而具有最近超时时间的将始终在队列的末尾。
    • @miguel 使用 libevent 您不需要这样做。只需为您的套接字 fd 注册一个读取事件以及一个计时器。 libevent 在内部维护一个最小堆中的计时器(我在 2006 年对 libevent 的贡献),并使用最早的计时器到期作为epoll 的超时。
    猜你喜欢
    • 2015-07-20
    • 2013-07-20
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多