Существует ли POSIX-совместимый способ получения IP-адреса локальной сети моего компьютера? - PullRequest
3 голосов
/ 27 декабря 2011

Я знаю, что этот вопрос задавался миллион раз в той или иной форме, но ни один вопрос не дал мне POSIX-совместимого способа сделать это.

Мне нужно получить адрес локальной сети моего компьютера без с использованием getifaddrs или любым другим не POSIX-совместимым способом доступа к интерфейсам.Это возможно?

Ответы [ 5 ]

6 голосов
/ 27 декабря 2011

Прямой поддержки для такой вещи нет, но вы можете использовать сокеты udp (SOCK_DGRAM) для connect по известному удаленному адресу. Поскольку сокеты udp не сохраняют состояние, это не делает сетевой трафик.

Затем вы можете запросить локальную конечную точку этого сокета (getsockname), чтобы получить локальный IP-адрес, по которому ваша система будет маршрутизировать. Опять же, поскольку udp не имеет состояния, это просто запрашивает ваши локальные таблицы маршрутизации, и реальный сетевой трафик не выдается.

Не забудьте после этого закрыть розетку.

Удаленные публичные серверы имен хороши для этой цели. Вы можете проверить несколько из них

  • один из них может время от времени не работать или не может быть маршрута для какая-то причина для этой части мира
  • ваш процесс может находиться в той же локальной сети, что и сервер, и вы может получить только специальный локальный адрес
  • тест для адресов IPv4 и IPv6
3 голосов
/ 27 декабря 2011

Нет, это невозможно, поскольку posix не указывает API для доступа к этой информации.

Unix, как правило, поддерживают getifaddrs или SIOCGIFCONF ioctl, поэтому используйте один из них или какой-либо другой системный API. Обратите внимание, что на машине может быть (и обычно есть) несколько сетевых интерфейсов, и вам нужно выяснить, в чем вы заинтересованы.

0 голосов
/ 01 сентября 2015

POSIX не имеет понятия «сеть», тем более IP. Так что нет.

Кроме того, у машины может быть много сетевых адресов (по крайней мере, петлевой, по одному или несколько для каждой сетевой карты, по крайней мере, три адреса IPv6, ...), " сетевой адрес " isn ' В любом случае, он хорошо определен.

0 голосов
/ 28 декабря 2011
#include <stdio.h>

int main(int argc, char* argv[]) {
   printf("127.0.0.1\n");
}
0 голосов
/ 28 декабря 2011

Довольно просто, конечно:

#include <unistd.h>

int main(int argc, char* argv[]) {
  return 8 == write(1, "0.0.0.0\n", 8) ? 0 : 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...