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

时间:2011-11-01 17:14:50

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

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

正如Ben所说,您可以使用具有许多操作系统实现的非标准库。 绝不是提升银弹,但是增强型asio库是一个非常有用,设计良好的便携式网络库,可以实现许多操作系统。特别是asio提供了ip::host_name方法。

答案 3 :(得分:0)

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