在为对等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();
});
}