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.