是否有可能使用 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
注意 注意:如果混淆是由于 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/