Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Networking socket.recvfrom是否始终返回有效地址?_Networking_Sockets - Fatal编程技术网

Networking socket.recvfrom是否始终返回有效地址?

Networking socket.recvfrom是否始终返回有效地址?,networking,sockets,Networking,Sockets,我正在研究一种通信协议,通过在本地网络上广播/多播对等方的地址来支持自我配置。直观的方法是广播地址,但事实证明,根据配置,很难可靠地计算出当前机器的本地IP地址,您可能会得到127.0.0.1或其他无用的地址 另一种方法是不在广播消息中包含主机地址,而是让接收者在其套接字上调用recvfrom,该套接字不仅返回接收到的数据,还返回发送者的地址。在我看来,这个调用在Unix和Windows上都是可用的,这是我的要求之一,可能还有更多的平台。我现在的问题是,是否存在这样的情况:这可能会失败,并且re

我正在研究一种通信协议,通过在本地网络上广播/多播对等方的地址来支持自我配置。直观的方法是广播地址,但事实证明,根据配置,很难可靠地计算出当前机器的本地IP地址,您可能会得到127.0.0.1或其他无用的地址


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

如果您将此技术限制为仅广播UDP,则应该可以。唯一的事情,往往会弄乱这是像双重NAT或发夹NAT的事情。不过,对于仅本地的广播来说,这是不可能的。

如果您将此技术限制为仅广播UDP,则应该可以。唯一的事情,往往会弄乱这是像双重NAT或发夹NAT的事情。这还不适用于仅限于本地的广播。

任何地址都可能无法访问,因此根据您的定义,在任何时候都是无用的。你的软件应该准备好处理这个问题

您可以可靠地确定系统的IP地址注意复数形式,通过枚举接口,一分钟内就可以了解更多。在不同的平台上如何实现这一点会有所不同,因为标准(如POSIX)中没有规定如何实现这一点。许多Unixy系统都有一个GetIFADRS调用;Windows还有其他功能。无论哪种方式,隔离代码都应该很容易

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

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


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

任何地址都可能无法访问,因此根据您的定义,在任何时候都是无用的。你的软件应该准备好处理这个问题

您可以可靠地确定系统的IP地址注意复数形式,通过枚举接口,一分钟内就可以了解更多。在不同的平台上如何实现这一点会有所不同,因为标准(如POSIX)中没有规定如何实现这一点。许多Unixy系统都有一个GetIFADRS调用;Windows还有其他功能。无论哪种方式,隔离代码都应该很容易

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

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


如果您的协议仅用于连接的网段,则从未连接的子网丢弃数据将是一件合理的事情。

这个问题在堆栈溢出时会更好。@Blrfl:您完全正确,我的错。你愿意为一个离题的结尾投票吗?这样我们就可以把它移到那边去了。我还差70分才能做到这一点。但我会给你写一封回信-关于堆栈溢出,这个问题会更好。@Blrfl:你完全正确,我的错。你愿意为一个离题的结尾投票吗?这样我们就可以把它移到那边去了。我还差70分才能做到这一点。但我会给你写一封回信-多播还是UDP呢?对于我期望的少量对等点来说,这是不必要的,但我希望支持不支持广播的IPv6网络。那么多播仍然是UDP呢?对于我期望的少量对等点来说,这是不必要的,但我希望支持IPv6网络 它不支持广播。