2

我正在研究一种通信协议,该协议应该通过在本地网络上广播/多播对等方的地址来支持自我配置。直观的方法是广播地址,但事实证明,很难可靠地找出当前机器的本地 IP 地址(取决于配置,您可能会得到“127.0.0.1”或另一个无用的地址) .

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

4

2 回答 2

3

如果您将此技术限制为仅广播 UDP,则应该没问题。唯一容易与此混淆的是双 NAT 或发夹 NAT。无论如何,仅在本地进行的广播还没有做到这一点。

于 2012-07-17T10:43:34.740 回答
1

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

您可以通过枚举接口可靠地确定系统的 IP 地址(请注意复数,稍后会详细介绍)。您如何做到这一点在平台之间会有所不同,因为标准(例如,POSIX)中没有指定应该如何完成的内容。许多 Unixy 系统都有getifaddrs()调用;Windows 做其他事情。无论哪种方式,隔离该代码应该很容易。

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

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

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

于 2012-07-17T15:25:47.813 回答