Получить мой IP-адрес и преобразовать его в байты с помощью C ++ - PullRequest
0 голосов
/ 01 ноября 2011

Каков наилучший способ получить ваш IP-адрес и затем преобразовать его в байты с помощью C ++? Мне нужно что-то кроссплатформенное. Я нашел много, но я не знаю, какая техника самая лучшая.

Ответы [ 4 ]

4 голосов
/ 01 ноября 2011

Вы можете использовать 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 голос
/ 01 ноября 2011

Как сказал Бен, вы можете использовать нестандартную библиотеку, которая имеет реализации для многих ОС. Это ни в коем случае не является стимулом Silver Silver, но библиотека boost asio - это действительно полезная, хорошо спроектированная, портативная сетевая библиотека с реализациями для многих операционных систем. В частности, asio предоставляет метод ip :: host_name .

1 голос
/ 01 ноября 2011

Не существует стандартного способа сделать это в C ++, поскольку C ++ также работает в системах, в которых нет сети.

Каждая операционная система имеет свой способ запроса адресов локальных интерфейсов.Самая «переносимая» вещь, которую вы можете надеяться найти, - это библиотека, которая обеспечивает единый согласованный интерфейс с базовыми реализациями, соответствующими всем основным операционным системам.

0 голосов
/ 01 ноября 2011

Для преобразования IP в строку можно использовать два метода: inet_ntoa (только IPv4) или getnameinfo с флагом NI_NUMERICHOST (IPv4 и IPv6).

...