c++ - 在同一端口上发送和接收 UDP
问题描述
我使用X-Plane
并将其输出 UDP 数据发送到127.0.0.1:49000
. 当我的应用程序应该侦听同一端口以通过boost::asio
.
// at main function:
udp_server server(49000);
// class implementation:
class udp_server
{
public:
udp_server(int port) :
io_service(),
socket_(io_service, udp::endpoint(udp::v4(), port)) // Exception occurs here
{
start_receive();
udp_thread = std::thread([this](){io_service.run();});
}
void start_receive()
{
socket_.async_receive_from(
boost::asio::buffer(recv_buffer_), remote_endpoint_,
boost::bind(&udp_server::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
// ...
std::thread udp_thread;
boost::asio::io_service io_service;
udp::socket socket_;
udp::endpoint remote_endpoint_;
boost::array<char, 5000> recv_buffer_;
};
当我运行代码时,我在套接字初始化时收到一个异常:
bind:试图以访问权限禁止的方式访问套接字
这是有道理的,因为X-Plane
在这个端口写,我从同一个端口读取。我们俩都占用同一个港口。有没有办法克服这个问题?如果不是,是否意味着计算机上的两个应用程序无法通过 传输消息UDP
?
解决方案
这是有道理的,因为 X-Plane 正在这个端口写入,而我从同一个端口读取。
X-Plane 正在从该端口发送并接收到该端口。它会将数据报写入(并从其接收数据报)它必须与之通信的程序正在接收和发送的任何端口。
我们俩都占用同一个港口。有没有办法克服这个问题?
是的,选择一个不同的端口发送和接收。
如果不是,是否意味着计算机上的两个应用程序无法通过UDP传输消息?
他们当然可以。通常,一方会选择一个众所周知的端口,用于发送和接收。另一方使用它发送和接收的随机端口,发送到已知端口并从已知端口接收。
所以流程是:
- X-Plane 始终绑定到众所周知的端口 49,000。
- 您选择一个随机端口,例如 31,020。你绑定到那个端口。
- 您将数据报从端口 31,020 发送到端口 49,000,因为那是 X-Plane 的知名端口。
- X-Plane 接收从端口 31,020 到端口 49,000 的数据报,这是它绑定的端口。X-Plane 注意到数据报来自端口 31,020。
- X-Plane 向端口 31,020 发送响应,该端口是您的程序正在从端口 49,000 监听的端口,它绑定到并从中发送的端口。
- 您的程序从端口 49,000 到端口 31,020(它正在侦听的端口)接收数据报。
- 您的程序知道这是来自 X-Plane 的响应,因为它来自端口 49,000。
推荐阅读
- javascript - 在javascript的后台使用post方法打开url
- javascript - Digital Ocean Spaces:无法访问 text/css 和 text/javascript mime 类型文件
- c++ - 使用联合为结构创建构造函数
- javascript - JSDOM:删除曾经嵌套的块引用,但留下 2+ 嵌套块引用
- mongodb - 如果条件,如何在mongodb的另一个查询中使用一个查询布尔值?
- python - google.auth.exceptions.DefaultCredentialsError:在 Docker-compose 中找不到文件 /home/technophile/snap/skype/common/xyz.json
- matplotlib - 生成两个不重叠的色彩空间
- javascript - 在 HTML 中查找 React 组件的位置
- r - 将行乘以 R 中的某列
- python - 我的方法是蛮力搜索还是线性搜索?