我正在写一个守护进程,使得传出的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