首页 > 解决方案 > 在同一端口上发送和接收 UDP

问题描述

我使用X-Plane并将其输出 UDP 数据发送到127.0.0.1:49000. 当我的应用程序应该侦听同一端口以通过boost::asio.

我在这里这里使用了 boost 示例代码。

// 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

标签: c++socketsboostboost-asio

解决方案


这是有道理的,因为 X-Plane 正在这个端口写入,而我从同一个端口读取。

X-Plane 正在该端口发送并接收该端口。它会将数据报写入(并从其接收数据报)它必须与之通信的程序正在接收和发送的任何端口。

我们俩都占用同一个港口。有没有办法克服这个问题?

是的,选择一个不同的端口发送接收

如果不是,是否意味着计算机上的两个应用程序无法通过UDP传输消息?

他们当然可以。通常,一方会选择一个众所周知的端口,用于发送和接收。另一方使用它发送和接收的随机端口,发送到已知端口并从已知端口接收。

所以流程是:

  1. X-Plane 始终绑定到众所周知的端口 49,000。
  2. 您选择一个随机端口,例如 31,020。你绑定到那个端口。
  3. 您将数据报从端口 31,020 发送到端口 49,000,因为那是 X-Plane 的知名端口。
  4. X-Plane 接收从端口 31,020 到端口 49,000 的数据报,这是它绑定的端口。X-Plane 注意到数据报来自端口 31,020。
  5. X-Plane 向端口 31,020 发送响应,该端口是您的程序正在从端口 49,000 监听的端口,它绑定到并从中发送的端口。
  6. 您的程序从端口 49,000 到端口 31,020(它正在侦听的端口)接收数据报。
  7. 您的程序知道这是来自 X-Plane 的响应,因为它来自端口 49,000。

推荐阅读