Справочная информация:
Я пишу демон, который устанавливает исходящие соединения TCP / IP. Он будет работать на компьютерах с несколькими (не зацикленными) IP-адресами. Я бы хотел, чтобы пользователи могли указать в файле конфигурации демона, какой IP-адрес (а) использовать для исходящих соединений, или *
для использования всех.
Адреса будут использоваться поочередно, каждое соединение выходит из IP-адреса, который использовался не так давно. Это поведение важно, так как *
является заменой для «всех», поэтому демоны, работающие на нескольких машинах, могут указывать на один и тот же файл конфигурации на файловом ресурсе и каждый из них может использовать свой собственный набор IP-адресов.
Проблема:
Как получить список всех IP-адресов, на которых машина может устанавливать исходящие (то есть на любой другой компьютер) соединения? Учитывая список всех IP-адресов, как бы я отфильтровал петлевые адреса?
Я на C, и, если возможно, я бы хотел использовать только POSIX, но демон, вероятно, будет работать только на Linux-блоках, поэтому я бы принял Linux-ориентированный ответ.
Каждый IP-адрес будет доступен только на одном (возможно, виртуальном) сетевом устройстве, и наоборот, поэтому достаточно было бы перечислить сетевые устройства и получить связанные IP-адреса, хотя я бы не очень обрадовался этому. (Дополнительные вопросы: возможно ли даже связать несколько IP-адресов с одним устройством? Как насчет одного и того же IP-адреса на нескольких устройствах? Не важно.)
Недостаточно решений:
gethostname()
/ gethostbyname()
(как этот вопрос ). Используя этот метод, я всегда получаю 127.0.0.1 обратно (или .1.1 в Debian). Я подозреваю, что это потому, что имя хоста машины находится в файле hosts
, и это проверяет gethostbyname()
. (Я думаю, именно поэтому в Debian я всегда получаю 127.0.1.1: по умолчанию Debian добавляет localhost как 127.0.0.1 и имя хоста компьютера как 127.0.1.1 в файл hosts
, верно?) Мне бы хотелось решение, которое игнорирует hosts
и дает мне все на самом деле там.
- Мне повезло больше
getaddrinfo()
, чем gethostname()
/ gethostbyname()
. Кажется, связана та же проблема. Я проверил это, передав имя хоста машины и сервис (порт) NULL
; В документах говорится, что передача NULL
имени хоста И NULL
службы недопустима, и это подтверждается тестированием. Не уверен, как еще спросить это обо всем на машине, но я открыт для предложений в этом ключе.
- РЕДАКТИРОВАТЬ: этот ответ показывает, как получить IP-адрес из имени устройства, но не показывает, как перечислить имена устройств. Есть идеи?
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Я принял ответ Кески , чтобы дать ему кредит за указание на то, как это нужно сделать. Я опубликовал свой собственный ответ с указанием исходного кода того, как именно это сделать, если кому-то еще это понадобится.