- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
https://github.com/ThinkalVB/RTDS-Server
我正在制作一个简单的 UDP IPv6 服务器,它打印远程端点发送的 UDP 数据包的版本。但是这段代码表现得很奇怪。当发送 IPv6 和 IPv4 数据包时,它正在打印 IPv6
.我做错了什么? [在 Win10 中使用 Packet Sender Portable 6.2.3(127.0.0.1 和::1)进行测试]
#include <asio.hpp>
#include <iostream>
#include "udp_peer.h"
#include <thread>
asio::io_context ioContext;
asio::io_context::work worker(ioContext);
void runServer()
{
ioContext.run();
}
int main()
{
asio::ip::udp::endpoint mUDPep(asio::ip::udp::v6(), 321);
asio::ip::udp::socket mUDPsock(ioContext);
std::thread thread(runServer);
thread.detach();
asio::error_code ec;
UDPpeer udpPeer(&mUDPsock); // Ignore this, it contains the character array
asio::ip::udp::endpoint ep;
mUDPsock.open(mUDPep.protocol(), ec);
mUDPsock.bind(mUDPep, ec);
while (true)
{
auto dataSize = mUDPsock.receive_from(udpPeer.getReadBuffer(), ep);
if (ep.address().is_v4())
std::cout << "IPv4";
else
std::cout << "IPv6";
}
}
最佳答案
你只听v6。ep
不要规定你如何接收。
您的 v6 端点能够同时接收两者。打印实际端点以查看:
#include <boost/asio.hpp>
#include <iostream>
namespace asio = boost::asio;
using asio::ip::udp;
int main() {
asio::thread_pool context(1);
udp::socket sock(context, {udp::v6(), 8888});
udp::endpoint ep;
char arr[4096];
while (true) {
/*auto n =*/ sock.receive_from(asio::buffer(arr), ep);
std::cout
<< std::boolalpha << ep.address().is_v4() << " "
<< ep << "\n";
}
context.join();
}
现在发送两个数据包:
echo -n "hello world $RANDOM" | nc -6 -w 0 -u ::1 8888
echo -n "hello world $RANDOM" | nc -4 -w 0 -u 127.0.0.1 8888
打印:
false [::1]:49972
false [::ffff:127.0.0.1]:34368
For comparison, saying
udp::socket sock(context, {udp::v4(), 8888});
instead simply doesn't receive the v6 packet:true 127.0.0.1:39805
if (a.is_v4())
return asio::ip::address_v6::v4_mapped(a.to_v4());
该怎么办?
asio::ip::address_v4 a4;
if (a6.is_v4_compatible() || a6.is_v4_mapped())
a4 = a6.to_v4();
Looks like the more modern interface for this is going to be something like
a4 = make_address_v4(asio::ip::v4_mapped, a6);
#include <boost/asio.hpp>
#include <iostream>
namespace asio = boost::asio;
using asio::ip::udp;
int main() {
asio::thread_pool context(1);
udp::socket sock(context, {udp::v6(), 8888});
udp::endpoint ep;
char arr[4096];
for (auto n=2; n--;) {
/*auto n =*/ sock.receive_from(asio::buffer(arr), ep);
asio::ip::address_v4 a4;
{
auto a6 = ep.address().to_v6();
if (a6.is_v4_compatible() || a6.is_v4_mapped())
a4 = a6.to_v4();
}
std::cout
<< (a4.is_unspecified()? "not-mapped" : a4.to_string()) << " "
<< ep << "\n";
}
context.join();
}
打印
127.0.0.1 [::ffff:127.0.0.1]:54859
not-mapped [::1]:36231
关于c++ - Asio 同步 IPv6 UDP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62728636/
目前部署在 Kubernetes 中的服务,通过 Calico BGP 将 Service 与集群外网络打通,并在外部的 nginx 中配置 Service 地址对外进行服务暴露。经过一段时间的观察
如发现here , 有一种新的 kube 服务是 IPVS 并且有很多负载均衡算法。 唯一的问题是我没有找到指定这些算法的位置。 我的理解: rr:循环法->循环调用后端pod lc:最少连接-> 将
我想尝试这种新的代理模式以及它为我们的一些应用程序提供的各种调度程序。到目前为止,我一直无法找到更改默认模式的方法 iptables至 ipvs在 GKE 节点上。 每个人都说通过--proxy-mo
我想在现有集群中为 IPVS 启用 Kube-proxy 模式。目前,它在 IPtables 上运行。如何在不影响现有工作负载的情况下将其更改为 IPVS? 我已经安装了所有必需的模块来启用它。另外,
我正在开发的应用程序作为 Kubernetes 集群中的部署运行。为此部署创建的 Pod 分布在集群中的各个节点上。我们的应用程序一次只能处理一个 TCP 连接,并且会拒绝进一步的连接。目前,我们使用
我是一名优秀的程序员,十分优秀!