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.
4

2 回答 2

3

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

这个堆栈溢出问题有一个答案,解释了如何在 Linux 上提高这个限制,这篇博客文章有关于如何在 OS X 上做到这一点的资源。

也就是说,其他告诉你这不是一件特别理智的事情的受访者是对的。特别是,如果您实际上一直到 65535,您的操作系统可能会停止工作,这会覆盖整个临时端口范围,这意味着您可能无法再从这台机器建立 TCP 客户端连接。所以最好在你的问题中解释你为什么要这样做。

于 2013-10-31T17:21:25.443 回答
2

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

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

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

于 2013-10-31T13:50:08.050 回答