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 }
  • 相关阅读:
    Oracle 推出 ODAC for Entity Framework 和 LINQ to Entities Beta版
    Entity Framework Feature CTP 5系列文章
    MonoDroid相关资源
    MSDN杂志上的Windows Phone相关文章
    微软学Android Market推出 Web Windows Phone Marketplace
    使用 Visual Studio Agent 2010 进行负载压力测试的安装指南
    MonoMac 1.0正式发布
    Shawn Wildermuth的《Architecting WP7 》系列文章
    使用.NET Mobile API即51Degrees.mobi检测UserAgent
    MongoDB 客户端 MongoVue
  • 原文地址:https://www.cnblogs.com/hdtianfu/p/2732675.html
Copyright © 2011-2022 走看看