在同一端口上发送和接收UDP

时间:2018-11-01 07:57:43

标签: c++ sockets boost boost-asio

我使用a.publications.remove(p1, p4, p5) # remove three publications from a,它将其输出UDP数据发送到X-Plane。当我的应用程序应该侦听同一端口以通过127.0.0.1:49000接收数据时,问题就会加剧。

我在herehere使用了boost示例代码。

boost::asio

运行代码时,我在套接字初始化时收到异常:

  

bind:尝试以其访问权限禁止的方式访问套接字

这是有道理的,因为// 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_; }; 正在此端口上写入,而我从同一端口读取。我们俩都占用同一个港口。有什么办法可以克服这个问题?如果不是,是否表示计算机上的两个应用程序无法通过X-Plane传输消息?

1 个答案:

答案 0 :(得分:1)

  

这是有道理的,因为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。