【问题标题】:Get my IP address and convert it into bytes using C++获取我的 IP 地址并使用 C++ 将其转换为字节
【发布时间】:2011-12-19 16:32:16
【问题描述】:

获取 IP 地址然后使用 C++ 将其转换为字节的最佳方法是什么?我需要一些跨平台的东西。我找到了很多,但我不知道什么是最好的技术。

【问题讨论】:

  • 你的意思是获取运行代码的本地机器的ip地址(我假设是ipv4)?
  • 如果IP地址不止一个怎么办?还是没有?
  • 目前我不想太重视这一点,因为机器肯定会有一个 ip 地址.. 但是,我建议总是取第一个,例如 eth0 上的那个跨度>

标签: c++ networking cross-platform byte ip-address


【解决方案1】:

正如 Ben 所说,您可以使用一个 非标准 库,该库具有许多操作系统的实现。 boost 绝不是灵丹妙药,但 boost asio 库是一个非常有用的、精心设计的、可移植的网络库,具有适用于许多操作系统的实现。特别是 asio 提供了ip::host_name 方法。

【讨论】:

    【解决方案2】:

    可用于将 IP 转换为字符串的两种方法是 inet_ntoa(仅限 IPv4)或带有标志 NI_NUMERICHOST(IPv4 和 IPv6)的 getnameinfo。

    【讨论】:

      【解决方案3】:

      您可以使用 gethostname 后跟 gethostbyname 来获取您的本地接口内部 IP。

      你可以试试这个代码:

      struct IPv4
      {
        unsigned char b1, b2, b3, b4;
      };
      
      bool getMyIP(IPv4 & myIP)
      {
        char szBuffer[1024];
      
        #ifdef WIN32
        WSADATA wsaData;
        WORD wVersionRequested = MAKEWORD(2, 0);
        if(::WSAStartup(wVersionRequested, &wsaData) != 0)
          return false;
        #endif
      
      
        if(gethostname(szBuffer, sizeof(szBuffer)) == SOCKET_ERROR)
        {
          #ifdef WIN32
          WSACleanup();
          #endif
          return false;
        }
      
        struct hostent *host = gethostbyname(szBuffer);
        if(host == NULL)
        {
          #ifdef WIN32
          WSACleanup();
          #endif
          return false;
        }
      
        //Obtain the computer's IP
        myIP.b1 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b1;
        myIP.b2 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b2;
        myIP.b3 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b3;
        myIP.b4 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b4;
      
        #ifdef WIN32
        WSACleanup();
        #endif
        return true;
      }
      

      使用 htonl、htons、ntohl、ntohs 函数在网络和本地字节顺序之间进行转换。

      【讨论】:

      • 我计划获取我的 ipaddress (ipv4),我计划将其转换为字节,然后将这些字节放入要在多播中发送的消息中
      • Winsock 也不是跨平台的。
      • @Paul:这是 BSD 套接字。所有winsock的东西都被#if包围。
      • @Ben:现在是 - 因为现在答案已经得到改进,所以移除了 cmets 和否决票。
      【解决方案4】:

      在 C++ 中没有标准的方法可以做到这一点,因为 C++ 也可以在没有网络的系统上运行。

      每个操作系统都有不同的方式来查询本地接口地址。您希望找到的最“便携”的东西是一个库,它提供了一个与所有主要操作系统对应的底层实现的单一一致接口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 2015-04-24
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多