如何限制客户端服务器程序中的连接数
答
只有accept()
单个连接。
这里是一个典型的服务器例行:
s = socket(...);
bind(s, ...);
listen(s, backlog);
while (-1 != (t = accept(s, ...))) {
// t is a new peer, maybe you push it into an array
// or pass it off to some other part of the program
}
每完成accept()
通话,返回一个新的连接的文件描述符。如果您只希望收到一个单个连接,则只需要accept()
一次。想必你完成后该听,因此,关闭您的服务器太:
s = socket(...);
bind(s, ...);
listen(s, backlog);
t = accept(s, ...);
close(s);
// do stuff with t
如果您希望只一次处理一个连接,并连接关闭后,恢复听力,然后执行上面的accept()
循环,并确实接受进一步的连接,直到t
已关闭。
答
是否要拒绝所有连接或创建队列? 我认为你正在寻找的是所谓的“单身人士”。 看看单身设计模式的wikipadia。
+1
我不认为他会找到C的Singleton模式;) – Prine 2010-11-12 12:40:52
答
更正看到下面:
您可以定义在
接受的请求量听方法。
listen(socketDescription, numberOfConnectionsPending);
第二个参数是设置挂起连接的数量,而不是连接本身的量..
如果设置了
numberOfConnections 1所有其他客户端,它发送一个请求到服务器将收到一个
超时错误 ..
在这里您可以找到更多的信息:http://shoe.bocks.com/net/#listen
我读了听错文档。你应该使用Matt的答案中描述的accept方法。
感谢您的宝贵意见,其实我怎么知道第一个连接是否已经关闭?因为如果我的第一次连接是理想的一段时间?如果我收到一个新的连接,我必须在接受这个新连接之前检查第一个连接是否处于活动状态。我们有办法实现这种情况吗? – Thangaraj 2010-11-13 05:10:25
当你从一个套接字读取()时,它已经关闭,它将返回0.你也可以通过调用'close()'或'shutdown()'来自己关闭它。只要不满意你已完成连接,就不要从你的函数处理't'中返回。请记住,一次处理多个连接是可能的,但我认为处理单个连接就是你所追求的。 – 2010-11-13 08:57:25
真的很棒的回答Matt Jonier,在这里我们还有一个问题,假设读/写由其子进程处理,并且连接由其父进程处理。在这种情况下,如果我们使用read()检查连接状态来实际读取一些数据,我们需要IPC将数据从父进程发送到子进程,这是不是开销?我们是否也有解决方案?我有一个解决方案。我们可以使用getpeername()来检查当前活动连接的状态,是否会有任何副作用?我不确定这是否能解决问题?请分享您的想法。 – Thangaraj 2010-11-13 13:24:53