【发布时间】:2016-08-28 12:53:29
【问题描述】:
我使用 miniupnpc 和我的包装器。当我的朋友运行我的应用程序时,该应用程序会创建 upnp。
源客户端:
upnp::upnp_wrapper upnp{};
upnp.redirect(upnp::internal_port{ 41052 },
upnp::external_port{ 41052 },
upnp::eProtocol::UDP, "Description");
io_service service;
ip::udp::socket socket{ service };
socket.open(ip::udp::v4());
socket.bind(ip::udp::endpoint{ ip::udp::v4(), 41052 });
ip::udp::endpoint server_ep{ ip::address::from_string("100.71.188.14"s), 9999u };
std::cout << "open: " << socket.local_endpoint().address().to_string() << ':' << socket.local_endpoint().port() << '\n';
cout << "send request\n";
socket.send_to(buffer("open: " + socket.local_endpoint().address().to_string() + ':' + std::to_string(socket.local_endpoint().port()) + '\n'), server_ep);
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_to(buffer("GOOOOD"s), server_ep);
cout << "\n\nEND";
cin.get();
和服务器测试源:
using namespace std;
using namespace literals;
using namespace boost::asio;
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();
我对 upnp 和 boost asio 做错了什么?如何正确使用 upnp 打开内部和外部端口?
【问题讨论】:
-
您的服务器是否在本地工作,即两者之间没有 upnp?
-
不,我已经在我的路由器中为我的电脑转发了端口。我可以从客户那里得到消息,但客户听不到答案
-
但是路由器打开了另一个端口。打开套接字时我没有打开。
标签: c++ boost boost-asio upnp