2013-10-31 79 views
1

我正在玩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. 
+0

添加更多的听众,你叫'reactor.run(前)'为每个端口要听...... –

+0

我在范围(0受审循环(对于我一个,64510)和1025 + 1,而是错误发生 - 对许多文件打开 –

+0

嗯...是...为什么一个进程需要这么多开放端口?这只是荒谬的... –

回答

3

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

This stack overflow question有一个答案,解释如何提高Linux上这个限制,并且this blog post具有资源如何做到这一点在OS X

这么说,谁告诉你其他的受访者认为这是不是一个特别理智的事情是正确的。特别是,如果实际上一直到65535,您的操作系统可能会停止工作,这将覆盖整个ephemeral port range,这意味着您可能无法再通过本机进行TCP客户端连接。所以最好在你的问题中解释你为什么这样做。

+0

仅用于测试目的。这就是它立即断开连接的原因。 –

+0

测试什么? – Glyph

2

通常的解决方案是为具有一个监听端口(由所选服务器!)。如果您希望每个客户端位于其自己的端口上,则服务器将选择该端口,开始监听端口,然后使用该端口将客户端请求用于进一步请求。

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

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

+0

服务器不应该需要发出一个唯一的ID - 元组''(serverIP ,serverPort,cli entIP,clientPort)'是连接的充分和唯一的。 – twalberg

+1

@twalberg是的。然而,编写服务器代码来收集这些数据并在状态图中查找它对于每个客户端请求来说都是微不足道的。进入状态向量的单个索引非常简单。 – ravenspoint