我出于爱好创建了一个洪流跟踪器。问题是如何在没有手动端口转发的情况下解决种子问题?
一般大家都写NAT-PMP和UPNP方案。但是 upnp 不是一个非常受支持的解决方案,我指的是它在搜索设备时从未找到任何东西的事实。 它也不想与 NAT-PMP 一起工作。 我的另一个问题是,他们通常使用什么?
我尝试了以下解决方案。 但我无法让它工作。在这里我不想关注 NAT-PMP 解决方案,而是关注有效的解决方案。
NAT-PMP解决方案:
void nat_pmp_request(boost::asio::io_service& io_service, const std::string& gateway, unsigned short int local_port, unsigned short int external_port) {
udp::socket socket(io_service, udp::v4());
udp::endpoint endpoint(boost::asio::ip::address::from_string(gateway), 5351); // NAT-PMP Gateway IP and port
unsigned char request[] = {
0, 0, 0, 2, // NAT-PMP version (2)
0, 0, 0, 0, // Reserved
0, 1, // NAT-PMP opcode (port mapping request)
0, 0, // Reserved
(external_port >> 8) & 0xff, external_port & 0xff, // Desired external port in network byte order
(local_port >> 8) & 0xff, local_port & 0xff, // Local port in network byte order
0, 0, 0, 0, // Mapping lifetime (0 means the mapping lasts until it is explicitly removed)
0, 0, 0, 0 // Reserved
};
socket.send_to(boost::asio::buffer(request, sizeof(request)), endpoint);
}
# Main fuction
boost::asio::io_service io_service;
nat_pmp_request(io_service, "192.168.0.1", 49905, 49905);
io_service.run();
请求原始缓冲区似乎有太多字节(保留字节)。 看看这里:http://miniupnp.free.fr/nat-pmp.html