2010-06-16 81 views
3

關於驗證套接字端口的可訪問性和可訪問性的主題已有otherquestions檢查C/C++中的開放端口

如何尋找一個端口在C/C++中動態偵聽?

的基本過程,我試圖完成的是:

  1. 客戶開始
  2. 客戶端找到開放的端口XYZ並監聽它。
  3. 客戶端通過UDP數據報向服務器發送基本的'我在這裏'消息到端口信息
  4. 客戶端和服務器可以通信。

我知道你可以完成這樣的事情,如果你選擇一個任意的端口號,並嘗試bind ing。如果失敗,請增加數字並重試,直到獲得成功的「綁定」。

有沒有更好的方法來做到這一點?這似乎有點哈克。

+0

在消息內發送端口號會破壞NAT防火牆後面的客戶端,所以不要這樣做。只需讓服務器使用消息到達的端口即可。 – 2010-06-16 20:22:25

+0

這是哪種操作系統? – 2010-06-16 20:29:18

+0

@David Windows現在,但希望它最終也可以移植到Linux。 – 2010-06-16 20:31:22

回答

12

如果綁定到端口0,則會分配一個隨機端口。然後getsockname()可用於找出使用的實際端口。

+1

這將工作。但肖恩,不要在UDP消息中發送端口號。這將打破NAT。只需讓服務器響應消息到達的端口即可。 – 2010-06-16 20:21:31

+0

@贊NAT不會成爲一個問題。它只會用在同一網段上的元素之間。 – 2010-06-16 20:23:47

+0

+1當客戶端處於被動模式時,這也被FTP服務器使用 – INS 2010-06-16 20:41:02