c++ - 如何使用 Boost.Asio 解析 IPv4 地址的真实广播地址

标签 c++ boost-asio broadcast ipv4

是否有可能使用 Boost.Asio 获取给定 IPv4 地址的“真实本地”广播地址?

ip::address_v4::netmask仅返回基于 IPv4 地址类别的网络掩码,因此无法可靠地使用 ip::address_v4::broadcast 的重载。 .

我需要解析本地计算机上给定(现有)主机 IPv4 地址的特定广播地址,因为我在使用广播地址为 255.255.255.255 的 UDP 端点时遇到问题。

编辑:为了澄清,我不想将主机名解析为 IP 地址,反之亦然。

编辑:这是一个示例:

eth0:

host address: 192.168.0.1
net mask...: 255.255.0.0 (**not** class C)

所以我想检索广播地址192.168.255.255,但我想要指定的唯一输入是本地网络地址。因此,“解析”或“查询”是正确的术语,因为我不想计算它。

我有一个 UDPv4 服务器,我将其绑定(bind)到特定的本地端点(通过指定本地 IPv4 主机地址)。我想在单播模式和广播模式下使用该服务器,因此我还需要指定远程端点。我无法使用 ip::address_v4::broadcast 返回的“全局广播”地址来执行此操作,因为它总是返回 255.255.255.255 ,这会导致不良行为。除了主机地址之外,我还指定了一个标志来正确设置套接字选项,以通过basic_datagram_socket::broadcast启用广播。 .

如果您有一个如何实现此目标的示例,我将不胜感激。也许是我想得太复杂了...

最佳答案

我认为确实 boost::asio::ip::address_v4::broadcast 重载正是您所追求的:

#include <boost/asio.hpp>
#include <iostream>

using boost::asio::ip::tcp;

int main() {
    typedef boost::asio::ip::address_v4 A;

    A address = A::from_string("192.168.0.1");

    std::cout << "Address " << address << " has broadcast address " << A::broadcast(address, A::from_string("255.255.0.0")) << "\n";
}

打印:

Address 192.168.0.1 has broadcast address 192.168.255.255

查看 Live On Coliru

注意 注意:如果混淆是由于 192.168.0.1 被分类为 C 类,这是设计使然。

IANA 将 16 位 block 192.168.0.0/16 定义为“256 个连续 C 类网络”(请参阅 Classful description here 脚注很有启发性,并且Asio 实现与之匹配)。

关于c++ - 如何使用 Boost.Asio 解析 IPv4 地址的真实广播地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26636970/

相关文章:

c - Windows 工作站不可知设置广播客户端的正确方法是什么?

android - 触发android电池充电广播事件

c++ - 规避 C++ 空终止字符串的挫败感

C++ - 几个与 Boost.Asio 相关的问题

c++ - 我可以在两个不同的类实例中使用 boost asio 套接字引用吗?

c++ - Boost asio run vs work(歧义)——工作类的目的是什么?

android - 如何中止广播通知? (对于非有序广播)

c++ - openCV中高斯的拉普拉斯算子,如何找到零交叉点?

C++错误删除双端队列 vector 的元素

c++ - C++模板类问题中的类型条件