我正在构建一个可以接受和处理多个客户端连接的网络服务器。为此,我正在使用 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/