如何使用Boost.Asio解析IPv4地址的实际广播地址

时间:2014-10-29 17:28:33

标签: 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服务器,它绑定到特定的本地端点(通过指定本地IPv4主机地址)。我想在单播模式和广播模式下使用此服务器,因此我还需要指定远程端点。我无法通过"全球广播"由ip::address_v4::broadcast返回的地址,因为它始终返回255.255.255.255,从而导致意外行为。除主机地址外,我还指定了一个标志来正确设置套接字选项,以便通过basic_datagram_socket::broadcast进行广播。

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

1 个答案:

答案 0 :(得分:2)

我认为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被归类为Class C,则这是设计使然。

IANA将16位块192.168.0.0/16定义为&#34; 256个连续的C类网络&#34; (查看 Classful description here 脚注很有启发性,Asio实现与之匹配)。