2009-09-02 68 views
110

我試圖玩與進程間通信,因爲我無法弄清楚如何在Windows下使用命名管道我想我會使用網絡套接字。一切都在本地進行服務器能夠在單獨的進程中啓動從站並在某個端口上偵聽。奴隸完成工作並將結果提交給主人。如何確定哪個端口可用?我想我不能聽港口80或21?在本地主機上,如何選擇一個空閒端口號?

我正在使用Python,如果這會削減選擇。

謝謝!

+1

順便說一句,如果你隨便挑一個隨機的或隨機的上下的端口號(最好大於1024),它很可能會提供。你甚至可以使用端口80或21或其他任何東西,只要沒有其他程序正在監聽它。在任何時候,在一個正常的系統中,只有一小部分端口正在使用。 – 2009-09-02 00:33:04

+17

選擇一個隨機端口不是一個好主意 - 讓操作系統爲你選擇一個。 – Corehpf 2009-09-02 00:36:48

+0

在POSIX上:http://stackoverflow.com/questions/913501/how-to-let-kernel-choose-a-port-number-in-the-range-1024-5000-in-tcp-socket-pr – 2015-12-19 15:30:30

回答

170

不要綁定到特定的端口,要麼綁定到端口0 sock.bind(('', 0))。操作系統會爲您選擇一個可用的端口。您可以獲得使用sock.getsockname()[1]選擇的端口,並將它傳遞給從站,以便它們可以連接回去。

+2

請參閱http://stackoverflow.com/a/2838309/3538289有關'sock.bind(('',0))' – cevaris 2015-11-09 03:12:37

+4

的示例。您如何將數字傳遞給從服務器?聽起來像雞和雞蛋問題給我。 – Sebastian 2016-03-07 20:15:08

+0

如果從站是綁定後創建的,則可以在創建它們時將其作爲參數傳遞。或者,您可以將它寫入某個共享內存或兩個都可以訪問的文件,或者通過一些衆所周知的端口號訪問的中央服務器可以跟蹤它。 – mark4o 2016-03-07 22:20:48

35

將套接字綁定到端口0.將選擇一個從1024到65535的隨機空閒端口。您可以在bind()之後立即檢索選定的端口getsockname()

2

你可以聽任何你想要的端口;通常,用戶應用程序應該監聽端口1024以上(通過65535)。最重要的是,如果您擁有可變數量的監聽器,則需要爲您的應用分配一個範圍 - 比如20000-21000和CATCH EXCEPTIONS。這就是您如何知道端口在您的計算機上是否不可用(換句話說,被另一個進程使用)。

但是,對於您的情況,只要您在綁定失敗時輸出錯誤消息,就不會出現使用單個硬編碼端口作爲偵聽器的問題。

請注意,大多數套接字(對於從屬)不需要明確地綁定到特定的端口號 - 只有等待傳入連接的套接字(例如您的主節點)需要作爲偵聽器並綁定到港口。如果在使用套接字之前沒有爲套接字指定端口,則操作系統將爲該套接字分配一個可用的端口。當主設備想要響應發送數據的從設備時,發送方的地址在偵聽器接收數據時可以訪問。

我認爲你會爲此使用UDP?

6

對於男生什麼的片斷起見上面已經解釋:

import socket 
from contextlib import closing 

def find_free_port(): 
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s: 
     s.bind(('', 0)) 
     return s.getsockname()[1] 
+0

if localhost:maybe's.bind(('localhost',0))'better – codeskyblue 2017-10-17 06:57:47

相關問題