zoukankan      html  css  js  c++  java
  • 随机获取一个可用的端口号

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

    思路: 将一个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 }
  • 相关阅读:
    CF1540B Tree Array
    CF1539F Strange Array
    CF526F Pudding Monsters
    怎样用 VS 2017 编译 cpprestsdk 库
    【转】C语言中常见的内存错误与解决方法
    vs2019 windbg方式远程调试应层程序
    关于 类似QQ 长截图的方案
    AIX小型机
    vSphere
    Git的使用
  • 原文地址:https://www.cnblogs.com/hdtianfu/p/2732675.html
Copyright © 2011-2022 走看看