闲置期后关闭与客户端的连接

Close connection with client after inactivty period

我目前管理的服务器最多可以同时为 MAX_CLIENTS 个客户端提供服务。

这是我到目前为止编写的代码:

//create and bind listen_socket_

struct pollfd poll_fds_[MAX_CLIENTS];

for (auto& poll_fd: poll_fds_)
{
    poll_fd.fd = -1;
}

listen(listen_socket_, MAX_CLIENTS);

poll_fds_[0].fd = listen_socket_;
poll_fds_[0].events = POLLIN;

while (enabled)
    {
        const int result = poll(poll_fds_, MAX_CLIENTS, DEFAULT_TIMEOUT);

        if (result == 0)
        {
            continue;
        }
        else if (result < 0)
        {
            // throw error
        }
        else
        {
            for (auto& poll_fd: poll_fds_)
            {
                if (poll_fd.revents == 0)
                {
                    continue;
                }
                else if (poll_fd.revents != POLLIN)
                {
                    // throw error
                }
                else if (poll_fd.fd == listen_socket_)
                {
                    int new_socket = accept(listen_socket_, nullptr, nullptr);

                    if (new_socket < 0)
                    {
                        // throw error
                    }
                    else
                    {

                        for (auto& poll_fd: poll_fds_)
                        {
                            if (poll_fd.fd == -1)
                            {
                                poll_fd.fd = new_socket;
                                poll_fd.events = POLLIN;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    // serve connection
                }
            }
        }
    }

一切都很好,当客户端关闭其一侧的套接字时,一切都得到了很好的处理。

我面临的问题是,当客户端连接并发送请求时,如果它之后没有关闭其一侧的套接字,我不会检测到它并让该套接字处于“忙碌”状态。

有什么方法可以实现一个系统来检测某个时间后套接字上是否没有收到任何东西?这样我就可以释放服务器端的连接,为新客户留出空间。

提前致谢。

当客户端在特定时间内没有发送任何数据时,您可以关闭客户端连接。

对于每个客户端,您需要存储最后一次接收数据的时间。

周期性地,例如当poll() returns因为超时到期,你需要为所有客户端检查这个时间。当这个时间太久以前,你可以shutdown(SHUT_WR)close()连接。你需要确定什么是“很久以前”。

如果客户端没有任何数据要发送但想保持连接打开,它可以定期发送“ping”消息。服务器可以用“pong”消息回复。这些只是没有实际数据的小消息。这取决于您的 client/server 协议是否可以实现。