我正在寫一個守護進程,使得傳出的TCP/IP連接。它將在具有多個(非回送)IP地址的機器上運行。我希望用戶能夠在守護程序的配置文件中指定用於傳出連接的IP地址,或者使用全部的IP地址。
地址將在循環中使用,每個連接將從最近使用的IP地址出去。這種行爲很重要,*
也是「all」的替代品,所以在多臺機器上運行的守護程序可以指向文件共享上的同一個配置文件,並且每個都使用自己的一組IP地址。
問題:
我如何獲得的所有IP地址的機器可撥打(即以任何其它計算機)上連接一個列表?給定所有IP地址的列表,我將如何篩選出環回地址?
我在C中,如果可能我只想使用POSIX,但守護進程可能只運行在Linux機器上,所以我會接受以Linux爲中心的答案。
每個IP地址只能在一個(可能是虛擬的)網絡設備上使用,反之亦然,因此枚舉網絡設備並獲取關聯IP地址的方式也足夠了,儘管我不會爲此感到高興。 (方的問題:它甚至可以將多個IP地址與單個設備關聯怎麼回合在多個設備相同的IP不重要?)
不足解決方案:
gethostname()
/gethostbyname()
(如this question)。使用這種方法,我只能得到127.0.0.1(或Debian中的.1.1)。我懷疑這是因爲機器的主機名在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
服務是非法的,並且通過測試進行備份。不知道還有什麼要問它的機器上的所有內容,但我接受這方面的建議。 - 編輯:this answer顯示如何從設備名稱獲取IP地址,但不顯示如何枚舉設備名稱。有任何想法嗎?
最終編輯:我已經接受caskey's answer給他信貸指導我如何做到這一點。我已經發布了我的own answer,列出了在其他人需要的情況下如何完成它的源代碼。
我的意思是`人netdevice`,但後來我意識到它不是POSIX,所以它沒有任何意義。 – 2009-07-21 18:46:17