获取我的IP地址并使用c++将其转换为字节

Get my IP address and convert it into bytes using C++

本文关键字:转换 字节 c++ IP 我的 地址 获取      更新时间:2023-10-16

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

您可以使用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函数在网络和本地字节顺序之间进行转换。

在c++中没有这样做的标准方法,因为c++也运行在没有网络的系统上。

每个操作系统都有不同的方式来查询本地接口地址。你所能期望找到的最"可移植"的东西是一个库,它提供了与所有主要操作系统对应的底层实现的单一一致的接口。

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

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