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

标签 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;
  }

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

最佳答案

_io_service.run() 是一个阻塞调用。在 io_service 上调用停止之前,您的代码实际上不会通过该行。

关于c++ - 使用 boost::asio 创建异步 UDP 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11034188/

相关文章:

c++ - 使用结构/遗传算法

c++ - rand_r() :Identifier is undefined , vs2008

javascript - Node.js 中的异步递归问题

Java UDP 服务器 IP 碎片

c - Socket UDP 客户端内存泄漏

winapi - 客户端无法从 BROADCAST UDP 服务器接收消息。 (温索克)

c++ - 如何在 C++ 中读取性能计数器

c++ - 如何检测无符号整数溢出?

javascript - 多个 ajax 和非 ajax 函数后的回调

c++ - boost::asio:如何使用 async_accept 接受传入连接?