Как открыть конкретный глобальный порт с boost asio для upnp

Когда я открываю порт с этим на моем ПК:

ip::udp::socket socket{ service, { ip::udp::v4(), 4205 } };

и отправить сообщение на сервер с моего компьютера, локальные и глобальные открытые порты равны.

равный

Но, когда мой друг открывает клиентское приложение, у него разный локальный и глобальный порт.

разные

Я создаю upnp с одинаковыми внешними и внутренними портами. И мне нужен равный порт. upnp внешний порт и открытый внешний порт.

Как использовать upnp, если я не могу открыть конкретный внешний порт ?!

клиент:

upnp::upnp_wrapper upnp{};
upnp.redirect(upnp::internal_port{ 42053 },
upnp::external_port{ 42053 },
upnp::eProtocol::UDP, "Description");

io_service service;
ip::udp::socket socket{ service, { ip::udp::v4(), 42053 } };

ip::udp::endpoint server_ep{ ip::address::from_string("100.71.188.14"s), 9999u };

socket.connect(server_ep);

std::cout << "local_endpoint: " << socket.local_endpoint().address().to_string() << ':' << socket.local_endpoint().port() << '\n';

std::cout << "remote_endpoint: " << socket.remote_endpoint().address().to_string() << ':' << socket.remote_endpoint().port() << '\n';

cout << "send request\n";
socket.send(buffer("local_endpoint: " + socket.local_endpoint().address().to_string() + ':' + std::to_string(socket.local_endpoint().port()) + '\n' +
"remote_endpoint: " + socket.remote_endpoint().address().to_string() + ':' + std::to_string(socket.remote_endpoint().port()) + '\n'));
cout << "request sent\n\n";

array<char, 60> buff = {};
cout << "wait answer\n";
auto answer_length = socket.receive(buffer(buff));
cout << "answer recived: ";
cout.write(buff.data(), answer_length);

cout << "\nsend goodd\n";
socket.send(buffer("GOOOOD"s));cout << "\n\nEND";
cin.get();`

сервер:

io_service service;
ip::udp::socket socket{ service };
socket.open(ip::udp::v4());
socket.bind(ip::udp::endpoint{ ip::udp::v4(), 9999u });
ip::udp::endpoint client_ep;

array<char, 100> buff = {};
cout << "start recive\n";
auto recived_length = socket.receive_from(buffer(buff), client_ep);
cout << "message recived from: " + client_ep.address().to_string() + ':' + to_string(client_ep.port()) + "\n-> ";
std::cout.write(buff.data(), recived_length);

cout << "\n\nsend answer\n";
socket.send_to(buffer("ANSWER"s), client_ep);
cout << "answer sent\n";

cout << "start good\n";
recived_length = socket.receive_from(buffer(buff), client_ep);
std::cout.write(buff.data(), recived_length);

cout << "\nEND";
cin.get();

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]