Boost :: Asio UDP连接顺序

时间:2018-01-25 17:16:37

标签: c++ sockets boost udp boost-asio

我有一个通过以下方式传输到UDPClient的UDPServer:

UDPServer::UDPServer() :
  port_number_(1122),
  socket_(io_, ba::ip::udp::v4()),
  endpoint_client_(ba::ip::address::from_string("127.0.0.1"), port_number_)
{
  socket_.set_option(boost::asio::socket_base::reuse_address(true));
  socket_.bind(ba::ip::udp::endpoint(ba::ip::udp::v4(), port_number_));
}

void UDPServer::SendState(const std::vector<float>& state) {
  socket_.send_to(ba::buffer(state), endpoint_client_);
}

UDPClient通过以下方式接收数据:

UDPClient::UDPClient():
  port_number_(1122),
  socket_(io_, ba::ip::udp::v4()),
  endpoint_server_(ba::ip::address::from_string("127.0.0.1"), port_number_),
  n_receive_size_(4),
  receive_buffer_(n_receive_size_, 0)
{
  socket_.set_option(boost::asio::socket_base::reuse_address(true));
  socket_.bind(ba::ip::udp::endpoint(ba::ip::udp::v4(), port_number_));
}

void UDPClient::HandleReceive(const boost::system::error_code &error,
                              size_t bytes_transferred) {
// {do stuff .. }

  socket_.async_receive_from(ba::buffer(receive_buffer_), endpoint_server_,
                             boost::bind(&UDPClient::HandleReceive, this,
                             ba::placeholders::error,
                             ba::placeholders::bytes_transferred));
}

void UDPClient::ToogleCarUpdate(bool is_active, CarPtr car_ptr) {
  if (is_active && !thread_) {
      // {do stuff ..}
    socket_.async_receive_from(ba::buffer(receive_buffer_), endpoint_server_,
                               boost::bind(&UDPClient::HandleReceive, this,
                               ba::placeholders::error,
                               ba::placeholders::bytes_transferred));
    // start io_.run() in new thread
    thread_.reset(new boost::thread(
        boost::bind(&boost::asio::io_service::run, &io_)));
    std::cout << "UDPClient: Started listening .. " << std::endl;
  } else if (!is_active && thread_) {
    io_.stop(); // stop service
    thread_->join(); // stop thread
    io_.reset(); // make ready for new run invocation
    thread_.reset(); // delete thread pointee
    std::cout << "UDPClient: Stopped listening .. " << std::endl;
  }
}

现在,只要在UDPClient之前实例化UDPServer(在同一台机器上的不同进程/应用程序中运行),一切正常。 更具体地说,在UDPServer开始发送消息之前,必须调用UDPClient的socket_.bind(..)。

有趣的是,使用

  

echo“test”&gt; /dev/udp/127.0.0.1/1122

总是调用UDPClient的HandleReceive(..)。这暗示了发送例程是问题。有没有人建议如何解决这个问题?

感谢您的时间,

菲利克斯

0 个答案:

没有答案