我正在玩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 :(得分:3)
每个侦听端口都需要一个文件描述符(“打开文件”),每个文件描述符占用最大文件描述符配额的一个元素。
This stack overflow question有一个答案解释如何在Linux上提高此限制,this blog post有关于如何在OS X上执行此操作的资源。
那就是说,其他告诉你这不是特别明智的事情的受访者是对的。特别是,如果实际上一直到65535,操作系统可能会停止工作,这会取代整个ephemeral port range,这意味着您可能无法再从此计算机建立TCP客户端连接。因此,在你的问题中解释为什么你试图这样做会很好。
答案 1 :(得分:2)
通常的解决方案是拥有一个侦听端口(由服务器选择!)。如果您希望每个客户端都在自己的端口上,那么服务器会选择端口,开始监听它,并使用它将用于进一步请求的端口回复客户端。
这不是一个真正好用的端口资源!如果服务器需要保留每个客户端的状态信息,那么它应该在客户端首次连接时向每个客户端发出唯一ID,并且客户端应该对服务器的每个请求使用此ID。
但是,您可以经常设计系统,以便服务器不需要为每个客户端保留单独的状态信息。