隨機獲取一個可用的端口號


有時候我們可能需要隨機獲取一個可用的端口號,本文采用使用以下方法完成這項任務:

思路: 將一個socket 綁定到本機,使用getsockname獲取此socket關聯的端口號


我們可以定義這樣一個函數,用以獲取可用的端口號:

函數聲明
  bool getAvaliablePort(unsigned  short &port);
                                //  返回:若成功則為true, 否則為false

 下面是函數定義:

  1 /**

 2   * @brief 獲取可用的端口
 3   *
 4   * @param port : 輸出,返回可用的端口號
 5   *
 6   * @return 若成功則返回true,否則放回false
 7    */
 8  bool getAvaliablePort(unsigned  short &port)
 9 {
10      bool result =  true;
11 
12      //  1. 創建一個socket
13      SOCKET sock = socket(AF_INET, SOCK_STREAM,  0);
14 
15      //  2. 創建一個sockaddr,並將它的端口號設為0
16       struct sockaddr_in addr;
17     addr.sin_family = AF_INET;
18     addr.sin_addr.s_addr = htonl(ADDR_ANY);
19     addr.sin_port =  0;         //  若port指定為0,則調用bind時,系統會為其指定一個可用的端口號
20 
21       //  3. 綁定
22       int ret = bind(sock, (SOCKADDR*)&addr,  sizeof addr);
23 
24      if ( 0 != ret) {
25         result =  false;
26          goto END;
27     }
28 
29      //  4. 利用getsockname獲取
30       struct sockaddr_in connAddr;
31      int len =  sizeof connAddr;
32     ret = getsockname(sock, (SOCKADDR*)&connAddr, &len);
33 
34      if ( 0 != ret){
35         result =  false;
36          goto END;
37     }
38 
39     port = ntohs(connAddr.sin_port);  //  獲取端口號
40 
41 END:
42      if (  0 != closesocket(sock) )
43         result =  false;
44      return result;
45 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM