【发布时间】:2012-05-31 18:05:51
【问题描述】:
据我了解,backlog 决定了连接队列 的大小。届时任何大于此大小的额外请求都将被丢弃(这种说法正确吗??)。
现在我有一个非常简单的程序server.c
socket()
bind()
listen(..., 5)
while(1)
{
accept()
read()
write()
sleep(3)
close()
}
现在,我一次启动 8 个客户端来连接到该服务器。令人惊讶的是,服务器为所有 8 个客户端提供服务,但它应该只排队 5 个客户端,其余 3 个客户端请求应该被拒绝。另一个有趣的点是即使我把这个积压值设为 0,结果还是一样的。然后我尝试评论 listen() 调用,所有 8 个客户端连接都被拒绝。
有人可以对此提供任何意见吗?
【问题讨论】:
-
您应该将
read、write和close放在并发环境中。在您的代码中,当下一个连接是accepted 时,似乎前一个连接已经关闭。将代码放在一个线程中,并确保每个连接持续足够长的时间,以确保真正发生 8 个客户端同时请求您的服务器的情况。 -
我正在测试 backlog 某个时间,但没有得到任何结果。希望现在就能看到答案。
-
OP,你能发布你的示例代码吗?以便人们可以复制/粘贴和测试它。
-
@ Summer_More_More_Tea 之前的连接无法立即关闭,因为存在 3 秒的休眠。这里所有 8 个请求都在 3 秒之前到达,因此请求已经超过了待处理队列(5)。