如何限制客户端服务器程序中的连接数

问题描述:

我想要一个服务器程序,它应该只接受最多一个连接,并且应该放弃其他连接。我怎样才能做到这一点?如何限制客户端服务器程序中的连接数

只有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已关闭。

+0

感谢您的宝贵意见,其实我怎么知道第一个连接是否已经关闭?因为如果我的第一次连接是理想的一段时间?如果我收到一个新的连接,我必须在接受这个新连接之前检查第一个连接是否处于活动状态。我们有办法实现这种情况吗? – Thangaraj 2010-11-13 05:10:25

+0

当你从一个套接字读取()时,它已经关闭,它将返回0.你也可以通过调用'close()'或'shutdown()'来自己关闭它。只要不满意你已完成连接,就不要从你的函数处理't'中返回。请记住,一次处理多个连接是可能的,但我认为处理单个连接就是你所追求的。 – 2010-11-13 08:57:25

+0

真的很棒的回答Matt Jonier,在这里我们还有一个问题,假设读/写由其子进程处理,并且连接由其父进程处理。在这种情况下,如果我们使用read()检查连接状态来实际读取一些数据,我们需要IPC将数据从父进程发送到子进程,这是不是开销?我们是否也有解决方案?我有一个解决方案。我们可以使用getpeername()来检查当前活动连接的状态,是否会有任何副作用?我不确定这是否能解决问题?请分享您的想法。 – Thangaraj 2010-11-13 13:24:53

是否要拒绝所有连接或创建队列? 我认为你正在寻找的是所谓的“单身人士”。 看看单身设计模式的wikipadia。

+1

我不认为他会找到C的Singleton模式;) – Prine 2010-11-12 12:40:52

更正看到下面:
您可以定义在 接受的请求量听方法。

listen(socketDescription, numberOfConnectionsPending); 

第二个参数是设置挂起连接的数量,而不是连接本身的量..

如果设置了 numberOfConnections 1所有其他客户端,它发送一个请求到服务器将收到一个 超时错误 ..

在这里您可以找到更多的信息:http://shoe.bocks.com/net/#listen

我读了听错文档。你应该使用Matt的答案中描述的accept方法。

+0

如何警告用户已经有其他连接处于活动状态,并且此时不是由于网络中断? – Thangaraj 2010-11-12 12:50:16

+0

有没有什么方法可以检查最后打开的套接字描述符是否处于活动状态? – Thangaraj 2010-11-12 13:10:44

+1

我想你可以在accept方法中检查这个。但我不确定.. accept()返回一个正整数,它是接受套接字的套接字描述符。如果发生错误,则返回-1,并将errno设置为指示原因。检查此网站:http://shoe.bocks.com/net/#accept – Prine 2010-11-12 13:57:54