C++ 使用Boost.asio将UDP数据包发送到公共IP

C++ 使用Boost.asio将UDP数据包发送到公共IP,c++,tcp,udp,boost-asio,p2p,C++,Tcp,Udp,Boost Asio,P2p,我想将UDP数据包发送到静态IP122.*.*.*.*.,UDP服务器监听端口1213 udp::resolver resolver(io_serviceSend); udp::resolver::query query(udp::v4(),"122.***.***.***","1213"); udp::endpoint receiver_endpoint = *resolver.resolve(query); udp::socket socket(io_service

我想将UDP数据包发送到静态IP
122.*.*.*.*.
,UDP服务器监听端口1213

udp::resolver resolver(io_serviceSend);
    udp::resolver::query query(udp::v4(),"122.***.***.***","1213");
    udp::endpoint receiver_endpoint = *resolver.resolve(query);

    udp::socket socket(io_serviceSend);
    socket.open(udp::v4());

    boost::shared_ptr<std::string> message(new std::string("Transfer"));

    socket.send_to(boost::asio::buffer(*message), receiver_endpoint);
udp::解析器解析器(io_serviceSend);
udp::解析器::查询查询查询(udp::v4(),“122.*.**”,“1213”);
udp::endpoint receiver_endpoint=*resolver.resolve(查询);
udp::套接字套接字(io_serviceSend);
socket.open(udp::v4());
boost::shared_ptr消息(新std::string(“Transfer”);
socket.send_to(boost::asio::buffer(*消息),接收方_端点);
但这失败了。是因为我将它发送到私有端口,而不是发送到NAT的端口。但是对于TCP来说,它工作得非常好。 谁能给我解释一下这个理论,或者贴一个好的链接

我的服务器代码是

UDPTunnel::UDPTunnel(boost::asio::io_service& io_service)
:socket_(io_service, udp::endpoint(udp::v4(), 1213))
{
start_receive();
}

void UDPTunnel::start_receive()
{
    socket_.async_receive_from(
            boost::asio::buffer(recv_buffer_), remote_endpoint_,
            boost::bind(&UDPTunnel::handle_receive, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred));
    cout << "\nUDP Started To Listening";
}

void UDPTunnel::handle_receive(const boost::system::error_code& error,std::size_t)
{
 cout << "\nUDP Recieved Message";
 if (!error || error == boost::asio::error::message_size)
  {
  cout << "\nRecieved Message";
  }
UDPTunnel::UDPTunnel(boost::asio::io_服务和io_服务)
:套接字(io_服务,udp::端点(udp::v4(),1213))
{
开始接收();
}
void UDPTunnel::start_receive()
{
套接字异步接收来自(
boost::asio::buffer(recv_buffer_uu)、remote_endpoint_uu、,
boost::bind(&UDPTunnel::handle_receive,这个,
boost::asio::占位符::错误,
boost::asio::占位符::字节(已传输);

你为什么提到NAT端口?你对你的设置有什么我们不知道的吗?既然你提到了NAT,那么UDP端口在防火墙中是打开的还是转发正确的。记住TCP和UDP使用不同的端口,即使数字相同。你所说的应用程序可能正在使用UPNP或类似的机制来启用port转发。或者为自己添加防火墙规则。@Navin如果您确定网络设置、防火墙和端口转发(在NAT的情况下),我看不到代码中有任何问题,那么我就没有什么要添加的了。@Navin不,boost不需要任何额外的东西。您需要确定您需要处理的基础结构的哪一部分(例如,打开传出防火墙,在服务器端的网关上启用正确的端口转发,以及可能与您的设置相关的其他事情)