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

获取我的IP地址,并使用C++; 什么是获得IP地址的最佳方式,然后用C++转换成字节?我需要一些跨平台的东西。我发现了很多,但我不知道什么是最好的技术。,c++,networking,cross-platform,byte,ip-address,C++,Networking,Cross Platform,Byte,Ip Address,您可以使用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(::WSASta

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

您可以使用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;
}

使用HtNoL、HtNT、NtoHL、NtoHS函数进行网络与本地字节顺序的转换。

< P>在C++中没有标准的方法,因为C++也运行在没有网络的系统上。
每个操作系统都有不同的方式来查询本地接口地址。最希望的“可移植”的东西是一个提供与所有主要操作系统对应的底层实现的单一一致接口的库。

< P>在C++中没有标准的方法来执行这一点,因为C++也运行在没有网络的系统上。
每个操作系统都有不同的方式来查询本地接口地址。您希望找到的最“可移植”的东西是一个库,它提供了一个一致的接口,底层实现对应于所有主要操作系统。

将IP转换为字符串的两种方法是inet\u ntoa(仅IPv4)或带有标记NI\u numerihost(IPv4和IPv6)的getnameinfo.

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

如本所述,您可以使用一个非标准库,该库具有许多操作系统的实现。
boost绝对不是银弹,但boost asio库是一个非常有用、设计良好、可移植的网络库,可用于多种操作系统。特别是asio提供了这种方法。

正如Ben所说的,您可以使用一个非标准库,该库具有许多OSs的实现。
boost绝对不是银弹,但boost asio库是一个非常有用、设计良好、可移植的网络库,可用于多种操作系统。特别是asio提供了该方法。

您的意思是获取代码运行的本地计算机的ip地址(我假设为ipv4)?如果有多个ip地址怎么办?或者没有?目前我不想对此给予太多的重视,因为机器肯定会有一个ip地址。。但是,我建议始终取第一个,例如eth0上的一个。您的意思是获取代码运行的本地计算机的ip地址(我假设为ipv4)?如果有多个ip地址怎么办?或者没有?目前我不想对此给予太多的重视,因为机器肯定会有一个ip地址。。但是,我建议始终采用第一种方式,例如eth0I计划获取我的ipaddress(ipv4),我计划将其转换为字节,然后将这些字节放入要在多播中发送的消息中Winsock也不跨平台。@Paul:这是BSD套接字。所有winsock的内容都被
#if
@Ben:现在-注释和否决票被删除了,因为答案已经得到了改进。我计划获得我的ipaddress(ipv4),我计划将其转换为字节,然后我将这些字节放在一条消息中,以多播方式发送winsock也不是跨平台的。@Paul:这是BSD套接字。winsock的所有内容都被
#if
@Ben:it now-note-comments和down-vote所包围,因为答案现在得到了改进。