接受带有套接字的无限连接



我正在使用套接字编程在python中创建一个简单的聊天应用程序,我需要我的套接字来接受无限数量的连接,而不像"socket.restance(100)",它被限制为100。请解释我应该如何处理大量连接?

listen()给出的数字是backlog队列的大小,这是对挂起请求数的提示,而不是活动请求数。

您经常会看到用于backlog参数的值5,这是历史记录。早期版本的Berkeley套接字有一个"特性",任何大于5的值都只给出5。所以是5。这个问题很久以前就解决了,但它仍然不是一个你需要太担心的数字——记住,这只是一个提示。

如果超过了backlog,则给客户端的实际错误通常是catch-allECONNREFUSED,但旧系统通常会有特定的backlog错误。

在许多系统上,backlog被静默地截断为SOMAXCONN

另请参阅listen()是否忽略backlog参数?

您希望有一个accept()循环,它只接受()新连接,并启动一个新线程来处理每个连接。每当有人尝试连接时,它都会立即接受它们,并将它们添加到连接列表中。

每个连接的线程都会有很长的超时,无论你希望会话空闲超时是什么。如果超时到期,你关闭套接字并退出线程。

如果服务器的FD用完了(如果有足够的同时连接),accept()将开始失败并返回相应的错误号:在这种情况下,您只需忽略它并继续循环。在这种情况下,您可能会减少空闲超时,并在接受重新开始工作时将其放回。

你对这个问题的看法有点错误。使用服务器端套接字,您可以接受到同一套接字的连接,然后由其他进程/线程处理这些连接。

#
# Setup socket and other handling stuff here
#
while True:
conn = sock.accept()
thread.start_new_thread(handler, (conn,))

根据系统的内存,套接字的最大数量将有一个实际限制。

请参阅http://docs.python.org/2/library/socketserver.html.我认为最后几个例子(在异步Mixins下)非常接近您想要实现的目标。

最新更新