2011-08-19 20 views
0

我有一個服務器(Java)和一些客戶端(C++),通過套接字連接。 我想自動設置端口。 假設IP已知。C++/Java套接字自動分配端口

在Java方面我可以做:

ServerSocket s = new ServerSocket(0); 

,現在我已在服務器上一個隨機的空閒端口。

我怎樣才能知道在C++端,服務器正在偵聽什麼端口?

+0

它無法知道服務器的端口號,它應該如何?您可以嘗試讓客戶端掃描服務器端口,但是這對您有什麼好處? – home

回答

3

我認爲是不可能的,如果你想建立與服務器的連接,你必須知道服務器在哪個端口監聽,有像nmap這樣的程序向你顯示服務器中打開的端口列表,但是服務器可以同時擁有多個打開的端口,然後,您如何知道服務器打開的端口是什麼?而且在任何情況下,調用外部工具的速度太慢且效率低下,讀取和解析其輸出。您爲什麼需要隨機端口服務?

其他選項可以獲取服務器端打開的套接字,調用s.getLocalPort()並通過UDP發送給網絡中的任何監聽節點,並重新編程客戶端以廣播方式監聽,以及何時接收到消息,檢查它是否是端口號並使用該端口連接到服務器。

+1

廣播是一種選擇,請記住,廣播(通常)不是由路由器通過局域網邊界轉發的,所以只有當所有客戶端位於同一LAN網段上時才能使用廣播。 – pap

+0

@JoanLledó我不想在C++客戶端中對端口進行硬編碼,因爲我不知道他們會有多少端口。我可能想隨時連接更多。 – anon

+0

@pap他們實際上在同一臺計算機上。我如何做到這一點。 – anon

0

你不能,不可靠。在IP中,機器由地址標識。服務器(即服務)由地址和端口標識。你的客戶需要某種形式的「已知服務」,他們可以連接到。

如果無論出於何種原因,絕對要擁有動態偵聽端口,可以將其與已知端口上的「定位器」服務結合使用。例如,在標準http端口(80)上有一個Web服務/ servlet。您的客戶端連接到「定位器」服務(始終在端口80上),並詢問您的應用程序當前正在偵聽哪個端口。這是一種並不罕見的模式。 RMI的工作方式與在已知端口上註冊表的方式類似。客戶端連接到註冊表並要求提供RMI端點的位置。

+0

我想避免這樣做。但如果這是唯一的解決方案... – anon