如果多连接网络服务器中有一段时间不活动,则关闭套接字

标签 c sockets http-1.1

我正在构建一个可以接受和处理多个客户端连接的网络服务器。为此,我正在使用 select()
现在,当这种情况发生时,如果特定连接的套接字上没有任何事件(发送或接收),我想关闭它。因此,如果一段时间内没有来自已连接客户端的请求,我将关闭套接字。有多个这样的连接套接字,我需要对每个套接字进行监控。

我需要此功能来创建持久连接,因为我的网络服务器必须支持 HTTP 1.1

执行此操作的最佳方法是什么?

最佳答案

我建议将调用 select 的超时设置为下一个套接字超时之前的最短时间。然后,如果超时,关闭空闲套接字,然后重复。像这样的伪代码:

timeout = default_timeout;
foreach(socket s)
{
    timeout = min(timeout, (s.last_send_or_recv_time + IDLE_TIMEOUT - now()));
}

result = select(..., timeout);
if(result == 0)
{
    foreach(socket s)
    {
        if(now() - s.last_send_or_recv_time >= IDLE_TIMEOUT)
        {
            close(s);
            remove_from_socket_list(s);
        }
    }
}
else
{
    // Handle received data, update last_send_or_recv_time, etc.
}

关于如果多连接网络服务器中有一段时间不活动,则关闭套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288627/

相关文章:

OpenSSL EVP_BytesToKey 方法的 C 版本

c - 搜索 -lSDL 时跳过 incompatible/libSDL.a

c++ - 我可以将任意源 IP 绑定(bind)到套接字吗?

javascript - Express - socket.io - session 。将用户 ID 称为套接字 ID

C# 使用 tcp 和 udp 协议(protocol)

java - SOAP 响应因负载过大而被截断

json - 使用 XML 和 JSON Content-Type 对 RESTful API 进行版本控制

rest - 如何在没有传输编码的情况下发送 POST 请求 :chunked from Jersey ReST Client 2. 22.2

c - 通过使用static关键字将全局变量变成非全局变量我们能得到什么?

c - 从文件中读取数字并将其分配给 C 中的数组时遇到问题