IP地址v4/v6等价性测试
IP address v4/v6 equivalence testing
是否有可能在使用IPv4和IPv6的双堆栈环境中测试IP地址的等效性?如果有,怎么做?
我的应用程序在Boost ASIO之上使用websocket++。
作为一个例子,在我的局域网中,一个应用程序连接到另一个监听192.168.1.2
,但使用这个答案的IP地址getter
std::string s = socket.remote_endpoint().address().to_string();
给出::ffff:192.168.1.3
作为客户端的地址。
问题是.2
将有自己的节点列表与.3
的原始v4地址,所以通过简单的字符串比较上面的getter与磁盘上保存的v4版本,它将寻求一个冗余连接到.3
,即使已经连接。
我进一步读到,事情可能会变得更复杂,因为这个点四分符号,::ffff:192.0.2.128
也是::ffff:c000:0280
。
我正在构建一个接受来自不可信来源的地址的p2p应用程序,因此为了防止冗余连接,我需要能够绝对测试等效性。
我的意图可以实现吗?如果有,怎么做?如果不是,我应该只使用v4吗?我更愿意现在就包含未来的功能,而不是担心以后的集成。
我认为你可以直接使用ip::tcp::address
类的operator==
。
查看Live On Coliru
#include <boost/asio.hpp>
using boost::asio::ip::address;
address from_string_ip6(std::string const& ip)
{
address a = address::from_string(ip);
if (a.is_v4())
return boost::asio::ip::address_v6::v4_mapped(a.to_v4());
else
return a;
}
int main()
{
address a = from_string_ip6("192.0.2.111");
address b = from_string_ip6("::ffff:192.0.2.111");
address c = from_string_ip6("::ffff:c000:026f");
assert(a == b);
assert(a == c);
assert(b == c);
}
更新如果您想包含任何有效地址的名称解析:ipv4和ipv6
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- 数据成员SFINAE的C++17测试:gcc vs clang
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为测试目标创建具有不同源文件夹的文件
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 换位表导致测试失败(但在游戏中运行良好)
- 用于交叉编译和CMake的预处理器宏的单元测试
- 谷歌测试中的期望值存储在哪里
- 如何在for循环中包含两个索引值的测试条件
- 在cygwin中测试新的boost安装时出现cpp错误
- 使用rdtsc进行基准测试的缺点是什么
- IP地址v4/v6等价性测试