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

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

思路: 将一个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 }
posted on 2012-10-20 22:02  sanlo  阅读(12428)  评论(0编辑  收藏  举报