我有一个通过以下方式传输到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(..)。这暗示了发送例程是问题。有没有人建议如何解决这个问题?
感谢您的时间,
菲利克斯