我有一個服務器(Java)和一些客戶端(C++),通過套接字連接。 我想自動設置端口。 假設IP已知。C++/Java套接字自動分配端口
在Java方面我可以做:
ServerSocket s = new ServerSocket(0);
,現在我已在服務器上一個隨機的空閒端口。
我怎樣才能知道在C++端,服務器正在偵聽什麼端口?
我有一個服務器(Java)和一些客戶端(C++),通過套接字連接。 我想自動設置端口。 假設IP已知。C++/Java套接字自動分配端口
在Java方面我可以做:
ServerSocket s = new ServerSocket(0);
,現在我已在服務器上一個隨機的空閒端口。
我怎樣才能知道在C++端,服務器正在偵聽什麼端口?
我認爲是不可能的,如果你想建立與服務器的連接,你必須知道服務器在哪個端口監聽,有像nmap這樣的程序向你顯示服務器中打開的端口列表,但是服務器可以同時擁有多個打開的端口,然後,您如何知道服務器打開的端口是什麼?而且在任何情況下,調用外部工具的速度太慢且效率低下,讀取和解析其輸出。您爲什麼需要隨機端口服務?
其他選項可以獲取服務器端打開的套接字,調用s.getLocalPort()
並通過UDP發送給網絡中的任何監聽節點,並重新編程客戶端以廣播方式監聽,以及何時接收到消息,檢查它是否是端口號並使用該端口連接到服務器。
你不能,不可靠。在IP中,機器由地址標識。服務器(即服務)由地址和端口標識。你的客戶需要某種形式的「已知服務」,他們可以連接到。
如果無論出於何種原因,絕對要擁有動態偵聽端口,可以將其與已知端口上的「定位器」服務結合使用。例如,在標準http端口(80)上有一個Web服務/ servlet。您的客戶端連接到「定位器」服務(始終在端口80上),並詢問您的應用程序當前正在偵聽哪個端口。這是一種並不罕見的模式。 RMI的工作方式與在已知端口上註冊表的方式類似。客戶端連接到註冊表並要求提供RMI端點的位置。
我想避免這樣做。但如果這是唯一的解決方案... – anon
它無法知道服務器的端口號,它應該如何?您可以嘗試讓客戶端掃描服務器端口,但是這對您有什麼好處? – home