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

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

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

转载于:https://www.cnblogs.com/hdtianfu/archive/2012/10/20/2732675.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值