socket.recvfrom会不会返回一个有效的地址?

时间:2012-07-17 06:58:44

标签: networking sockets

我正在开发一种通信协议,该协议应通过在本地网络上广播/组播对等方的地址来支持自我配置。直观的方式是广播地址,但事实证明,很难可靠地找出当前机器的本地IP地址(根据配置,你可能得到“127.0.0.1”或其他无用的地址)

另一种方法是不在广播消息中包含主机地址,而是让接收者在其套接字上调用recvfrom,这不仅会返回接收的数据,还会返回发送者的地址。正如我所看到的那样,该调用在Unix和Windows上都是可用的(我的一个要求),可能还有更多的平台。我现在的问题是,是否存在可能失败的情况,而recvfrom会返回无法访问或无用的地址?

2 个答案:

答案 0 :(得分:3)

如果将此技术限制为仅广播UDP,则应该没问题。唯一容易混淆的是双NAT或发夹NAT。对于那些本地的广播来说,这还没有完成。

答案 1 :(得分:1)

任何地址都可能随时变得无法访问(因此您的定义无法使用)。您的软件应该准备好处理它。

通过枚举接口,您可以可靠地确定系统的IP地址(请注意复数,一分钟内更多)。你如何做到这一点将因平台而异,因为标准(例如POSIX)中没有任何内容指明应如何完成。许多Unixy系统都有getifaddrs()个调用; Windows做了别的事情。无论哪种方式,隔离该代码应该很容易。

您的软件也不应该假设它遇到的IP是“地址”。在具有多个接口的系统上(如果计算环回,大多数接口),路由可能会更改,或者有人可能希望在与默认路由不在同一接口上的段上运行协议。

如果您要广播消息,则需要在每个接口上执行一次,包括环回,除非您配置为不这样做。广播也应该从每个接口发生,因此它具有正确的地址。您不能假设与任何接口在同一网段上的其他主机知道任何其他接口或有办法路由到其地址。

如果您的协议仅用于连接的网段,则从非连接的子网中丢弃数据是合理的。