Jak wyliczyć wszystkie adresy IP dołączone do komputera w POSIX C?

Tło:

Piszę demona, który wykonuje wychodzące połączenia TCP / IP. Będzie działać na komputerach z wieloma adresami IP (bez pętli zwrotnej). Chciałbym, aby użytkownicy mogli określić, w pliku konfiguracyjnym demona, które adresy IP mają być używane dla połączeń wychodzących, lub* korzystać ze wszystkich.

Adresy będą używane w obrocie, każde połączenie wychodzi z adresu IP używanego ostatnio. Takie zachowanie jest ważne* zastępując „wszystkie”, więc demony działające na wielu komputerach mogą wskazywać na ten sam plik konfiguracyjny na współużytkowanej pamięci plików, a każdy z nich powinien używać własnego zestawu adresów IP.

Problem:

W jaki sposób uzyskać listę wszystkich adresów IP, na które urządzenie może nawiązywać połączenia wychodzące (tj. Z dowolnym innym komputerem)? Biorąc pod uwagę listę wszystkich adresów IP, jak mogę odfiltrować adresy pętli zwrotnej?

Jestem w C i jeśli to możliwe, chciałbym używać tylko POSIX, ale demon prawdopodobnie będzie działał tylko w Linuksie, więc akceptuję odpowiedź zorientowaną na Linuksa.

Każdy adres IP będzie dostępny na dokładnie jednym (być może wirtualnym) urządzeniu sieciowym i na odwrót, więc wystarczający byłby również sposób wyliczania urządzeń sieciowych i uzyskiwania skojarzonych adresów IP, chociaż nie byłbym z tego zadowolony. (Pytania dodatkowe: czy możliwe jest nawet skojarzenie wielu adresów IP z jednym urządzeniem? Jaki jest ten sam adres IP w wielu urządzeniach? Nie ważne.)

Niewystarczające rozwiązania:

gethostname()/gethostbyname() (tak jakto pytanie). Używając tej metody, otrzymuję tylko 127.0.0.1 z powrotem (lub .1.1 w Debianie). Podejrzewam, że to dlatego, że nazwa hosta komputera jest whosts plik i tak daleko jakgethostbyname() czeki. (Uważam, że dlatego w Debianie zawsze otrzymuję 127.0.1.1: Debian domyślnie dodaje localhost jako 127.0.0.1, a nazwa hosta maszyny jako 127.0.1.1 dohosts plik, prawda?) Chciałbym rozwiązanie, które ignorujehosts i daje mi wszystko, co tam jest.Nie miałem więcej szczęściagetaddrinfo() niżgethostname()/gethostbyname(). Wydaje się być związany tym samym problemem. Przetestowałem to podając nazwę hosta komputera i aNULL usługa (port) do niego; doktorzy mówią, że mijającNULL nazwa hosta I aNULL usługa jest nielegalna i jest wspierana przez testowanie. Nie wiem, jak inaczej poprosić o wszystko na maszynie, ale jestem otwarty na sugestie w tym duchu.EDYTOWAĆ:ta odpowiedź pokazuje, jak uzyskać adres IP z nazwy urządzenia, ale nie pokazuje, jak wyliczyć nazwy urządzeń. Jakieś pomysły?

EDYCJA KOŃCOWA: Akceptujęodpowiedź caskeya dać mu uznanie za wskazanie mi, w jaki sposób należy to zrobić. Wysłałem mojewłasna odpowiedź wymieniając kod źródłowy tego, jak dokładnie to zrobić, jeśli ktoś inny tego potrzebuje.

questionAnswers(6)

yourAnswerToTheQuestion