簡體   English   中英

獲取 UDP 套接字的隨機端口

[英]Get random port for UDP socket

我需要創建一個程序,該程序將通過 UDP 套接字與同一台計算機上的其他程序進行通信。 它將從stdin讀取命令,其中一些命令將使其發送/接收數據包而不會停止執行。 我已經閱讀了一些信息,但由於我不熟悉套接字編程並且需要快速完成,所以我有以下問題:

  1. 我需要獲取一個隨機未使用的端口供程序監聽,並保留它以便其他程序可以與之通信,並且該端口不會被另一個程序保留。 我還需要將端口號存儲在一個變量中以備將來使用。
  2. 由於通信是在同一台機器上跨進程的,我想知道是否可以使用 PF_LOCAL。

此外,歡迎提供此類套接字設置的代碼示例,以及發送/接收字符串的示例。

調用bind()指定端口 0。這將允許操作系統選擇一個未使用的端口。 然后,您可以使用getsockname()檢索所選端口。

如果您需要臨時端口,Remy Lebeau 的回答很好。 如果您需要一個持久保留的端口,那就不太好,因為其他軟件也使用相同的方法來獲取一個端口(包括每個連接都需要一個新的臨時端口的 OS TCP 堆棧)。

所以可能會發生以下情況:

  1. 您使用 0 和 getsockname() 調用 bind 來獲取端口;
  2. 然后將其保存到配置(或多個配置)中以供將來使用;
  3. 需要此端口的軟件啟動並綁定該端口。

然后你需要重啟軟件:

  1. 軟件停止並解除綁定端口:該端口現在可以通過 bind(0) 和 getsockname() 再次返回;
  2. 例如,TCP 堆棧需要一個端口並綁定您的端口;
  3. 軟件無法啟動,因為端口已經綁定。

因此,對於“未來用途”,您需要一個不在臨時端口范圍內的端口(即 bind(host, 0) 返回端口的范圍)。

我對這個問題的解決方案是port-for命令行實用程序。

如果它是一個隨機端口實際上很重要,您應該執行以下操作:

srand(time(NULL));
rand() % NUM_PORTS; // NUM_PORTS isn't a system #define

然后在綁定中指定該端口。 如果失敗,請選擇一個新的(無需重新播種隨機生成器。如果隨機端口不重要,請查看 Remy Lebeau 的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM