随机获取一个可用的端口号

时间:2021-09-04 18:11:12

有时候我们可能需要随机获取一个可用的端口号,本文采用使用以下方法完成这项任务:

思路: 将一个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 }