与服务器的LAN网络上的对等体UDP打孔失败

时间:2013-11-20 14:26:04

标签: c++ udp boost-asio

在为对等UDP实现UDP打孔时,我遇到了一些奇怪的行为:

当我的服务器(S)与具有路由器(R)的对等体(P)在同一LAN上时

从P发送UDP数据包 - > S,服务器将数据包视为来自R,使用ip 192.168.1.1

修改

这意味着如果我在LAN P1和P2上有2个对等体,我会将P1和P2的数据包发送到服务器S.

它们似乎都是从192.168.1.1连接的。完成打孔后,我将P1的ip和端口发送到P2,反之亦然,

然后我直接从P1发送数据包< - > P2,绕过服务器S.这些数据包无法传送,因为我收到的IP显然是错误的 - 这是路由器的LAN IP,而我期望WAN IP。

但是,从S - >发送UDP数据包; P1或来自S-> P2成功

此外,一切都在与服务器不在同一LAN上的对等端上按预期工作。

1)为什么会这样?

2)如何让它在所有情况下都能正常工作?

LAN -> LAN, // fails
LAN -> WAN  // fails
WAN -> WAN  // works


void Client::sendStun()
{
using namespace boost::asio::ip;
UdpPacket packet(UdpPacket::STUN, id_);
udp::endpoint endpoint(address::from_string( serverIp_ ), serverPort_);
std::cout << "sending stun packet\n";
udpSocket_.send_to(boost::asio::buffer(&packet, sizeof(UdpPacket)), endpoint);
}

void Server::udpReceive()
{
    auto udpPacket = std::make_shared<UdpPacket>();
    auto endpoint = std::make_shared<boost::asio::ip::udp::endpoint>();
    udpSocket_.async_receive_from(
        boost::asio::buffer(&(*udpPacket), sizeof(UdpPacket)), *endpoint,
        [this, udpPacket, endpoint](boost::system::error_code ec, std::size_t bytes_recvd)
    {
        std::cout << "Received Udp Packet\n";
        if (!ec && bytes_recvd > 0)
        {
            if( udpPacket->type_ == UdpPacket::STUN)
            {
                endpoints_.insert( std::pair<unsigned, boost::asio::ip::udp::endpoint>(udpPacket->id_, *endpoint) );
                std::cout << "STUN: " << *endpoint << std::endl;
                udp_send_to( udpSocket_, UdpPacket(UdpPacket::MESSAGE, 0, "Server: STUN Received"), *endpoint ); // debug text
            }
        }

        udpReceive();
    });
}

0 个答案:

没有答案