2013-10-31 81 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