是否有可能获得真正的本地"使用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进行广播。
如果您有一个如何实现这一目标的例子,我将不胜感激。也许我觉得太复杂了......
答案 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
注意注意:如果混淆来自192.168.0.1
被归类为Class C
,则这是设计使然。
IANA将16位块192.168.0.0/16定义为&#34; 256个连续的C类网络&#34; (查看 Classful description here 脚注很有启发性,Asio实现与之匹配)。