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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值