使用boost :: asio创建异步UDP客户端

时间:2012-06-14 13:31:24

标签: c++ asynchronous udp client boost-asio

我尝试使用boost :: asio创建一个异步UDP客户端 我在互联网上获得了一些代码,并设法发送消息。 但我的客户端没有收到来自服务器的消息(当我不使用boost时它可以工作)。

这是我的代码

 class udp_async_client 
 {
 public:

   udp_async_client (boost::asio::io_service& io_service, std::string& host, std:: string port, char **av , int ac)
: reply ()
, _io_service (io_service)
, _sock (io_service, udp:: endpoint (udp:: v4 (), 0)) {

udp:: resolver resolver (_io_service);
udp:: resolver:: query query (udp:: v4 (), host, port);
udp:: resolver:: iterator endpoint_iterator = resolver.resolve (query);
sender_endpoint = *endpoint_iterator;

_io_service.run ();

//test request string                                                                                                                                                                                                                    
using namespace std;


std::string request = av[3];
for (int i = 4 ; i < ac ; ++i)
  {
    request += ";";
    request += av[i];
  }

std:: cout <<"Request is:" <<request <<std:: endl;



_sock.async_send_to (boost:: asio:: buffer (request.c_str(), request.length())
                     , sender_endpoint
                     , boost:: bind (&udp_async_client::handle_send_to_server
                                     , this, boost:: asio:: placeholders:: error
                                     , endpoint_iterator));

  }

 ~udp_async_client () {
_io_service.stop ();
  }

  void handle_receive_from (const boost::system::error_code& error,
                        size_t bytes_recvd) {}

  void handle_receive_from (const boost::system::error_code& error,
                        size_t bytes_recvd) {}

  void handle_send_to_server (const boost::system::error_code& e,
                          udp:: resolver:: iterator endpoint_iterator) {
std:: cout <<"Handle send to" <<std:: endl;
char reply [max_length] = {};
_sock.async_receive_from (
                          boost:: asio:: buffer (reply, max_length), sender_endpoint,
                          boost:: bind (&udp_async_client::handle_receive_from, this,
                                        boost:: asio:: placeholders:: error,
                                        boost::asio::placeholders::bytes_transferred));

std:: cout <<"Reply is:" <<reply <<std:: endl;
  }

private:
char reply [max_length];
boost::asio::io_service& _io_service;
udp:: socket _sock;
boost:: asio:: ip:: udp:: endpoint sender_endpoint;

};

和我的主要:

int main (int ac, char** av) {

  if (ac < 5) {
   std:: cerr <<"Usage: nonblocking_udp_echo_client <host> <port> <name> <name to reach> \n";
 return 1;
 }

  boost:: asio:: io_service io_service;
  std:: string host (av[1]);
  std:: string port (av[2]);

  while (true)
    {
     udp_async_client cli (io_service, host, port, av , ac);
     boost:: this_thread:: sleep (boost:: posix_time:: millisec (500));
   }
 return 0;
  }

我不知道我做错了什么......

1 个答案:

答案 0 :(得分:3)

_io_service.run()是一个阻止调用。在io_service上调用stop之前,您的代码实际上没有传递该行。