聆听多个端口

时间:2013-10-31 13:24:31

标签: python python-2.7 twisted

我正在玩Twisted并创建了一个简单的'服务器' 我想让服务器监听多个端口(1025-65535)而不是单个端口 我怎么能这样做?

我的代码:

from twisted.internet.protocol import Protocol,ServerFactory
from twisted.internet import reactor

class QuickDisconnectProtocol(Protocol): 
    def connectionMade(self): 
        print "Connection from : ", self.transport.getPeer()
        self.transport.loseConnection() # terminate connection


f = ServerFactory()
f.protocol = QuickDisconnectProtocol
reactor.listenTCP(6666,f)
reactor.run()

已经尝试过这个:

for i in range (0, 64510):
    reactor.listenTCP(1025+i,f)

reactor.run()

但收到错误:

Traceback (most recent call last):
  File "Server.py", line 14, in <module>
  File "/usr/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 436, in listenTCP
  File "/usr/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 641, in startListening
twisted.internet.error.CannotListenError: Couldn't listen on any:2044: [Errno 24] Too many open files.

2 个答案:

答案 0 :(得分:3)

每个侦听端口都需要一个文件描述符(“打开文件”),每个文件描述符占用最大文件描述符配额的一个元素。

This stack overflow question有一个答案解释如何在Linux上提高此限制,this blog post有关于如何在OS X上执行此操作的资源。

那就是说,其他告诉你这不是特别明智的事情的受访者是对的。特别是,如果实际上一直到65535,操作系统可能会停止工作,这会取代整个ephemeral port range,这意味着您可能无法再从此计算机建立TCP客户端连接。因此,在你的问题中解释为什么你试图这样做会很好。

答案 1 :(得分:2)

通常的解决方案是拥有一个侦听端口(由服务器选择!)。如果您希望每个客户端都在自己的端口上,那么服务器会选择端口,开始监听它,并使用它将用于进一步请求的端口回复客户端。

这不是一个真正好用的端口资源!如果服务器需要保留每个客户端的状态信息,那么它应该在客户端首次连接时向每个客户端发出唯一ID,并且客户端应该对服务器的每个请求使用此ID。

但是,您可以经常设计系统,以便服务器不需要为每个客户端保留单独的状态信息。