boost::asio::io_service 超时设置

class client
{
public:
  /*client(const udp::endpoint& listen_endpoint)
    : socket_(io_service_, listen_endpoint),
      deadline_(io_service_)
  {
    deadline_.expires_at(boost::posix_time::pos_infin);
    check_deadline();
  }

std::size_t receive(const boost::asio::mutable_buffer& buffer,
      boost::posix_time::time_duration timeout, boost::system::error_code& ec)
  {
    deadline_.expires_from_now(timeout);
    ec = boost::asio::error::would_block;
    std::size_t length = 0;
    socket_.async_receive(boost::asio::buffer(buffer),
        boost::bind(&client::handle_receive, _1, _2, &ec, &length));
    do io_service_.run_one(); while (ec == boost::asio::error::would_block);

return length;
  }*/

//此处是我修改的,设置传入的io操作。
  client(boost::asio::io_service *io_service_input,udp::socket *socket_input)
    :socket_(socket_input),io_service_(io_service_input),deadline_(*io_service_input)
  {
    deadline_.expires_at(boost::posix_time::pos_infin);
    check_deadline();
  }

std::size_t receive(const boost::asio::mutable_buffer& buffer,
      boost::posix_time::time_duration timeout, boost::system::error_code& ec)
  {
    deadline_.expires_from_now(timeout);
    ec = boost::asio::error::would_block;
    std::size_t length = 0;
    socket_->async_receive(boost::asio::buffer(buffer),
        boost::bind(&client::handle_receive, _1, _2, &ec, &length));
    do io_service_->run_one(); while (ec == boost::asio::error::would_block);

return length;
  }

private:
  void check_deadline()
  {
    if (deadline_.expires_at() <= deadline_timer::traits_type::now())
    {
      socket_->cancel();
      deadline_.expires_at(boost::posix_time::pos_infin);
    }
    deadline_.async_wait(boost::bind(&client::check_deadline, this));
  }

static void handle_receive(
      const boost::system::error_code& ec, std::size_t length,
      boost::system::error_code* out_ec, std::size_t* out_length)
  {
    *out_ec = ec;
    *out_length = length;
  }

private:
  boost::asio::io_service *io_service_;
  udp::socket *socket_;
  deadline_timer deadline_;
};

使用方法:

google::protobuf::Message * CBoost_Udp::Send(const google::protobuf::Message& message, struct endUdpadress clientIpPort, std::string &sErrorMsg)
 {
    int nSendlenth = 0;
    string str_sendmsg = "";
    char recvBuf[1024*4];
    memset(recvBuf,‘\0‘,1024*4);
    boost::asio::io_service io_service;
    udp::resolver resolver(io_service);
    char chPort[64] = {‘\0‘};
    sprintf(chPort,"%d",clientIpPort.intPort);
    udp::resolver::query query(udp::v4(), clientIpPort.strip, chPort);
    udp::endpoint sendandrecv_endpoint = *resolver.resolve(query);
    udp::socket udp_socket(io_service);

udp_socket.open(udp::v4());
    google::protobuf::Message * ret = NULL;
    str_sendmsg = encode(message);
    try
    {
        nSendlenth = udp_socket.send_to(boost::asio::buffer(str_sendmsg.c_str(), str_sendmsg.size()), sendandrecv_endpoint);
        client c(&io_service,&udp_socket);//接收数据的时候等待5秒

boost::system::error_code ec;

std::size_t nrecv = c.receive(boost::asio::buffer(recvBuf),boost::posix_time::seconds(5), ec);//设置等待时间。

if (ec)
        {
            std::cout << "Receive error: " << ec.message() << "\n";
            return NULL;
        }
        //int nrecv = udp_socket.receive_from(boost::asio::buffer(recvBuf,1024),sendandrecv_endpoint);
        std::string data_rec(recvBuf,nrecv);
        std::string srecv = data_rec.substr(sizeof(int));
        ret = dynamic_cast<google::protobuf::Message*>(decode(srecv));
        if(ret!= NULL)
        {
            cout<<"recv message after send success"<<endl;
        }
        else
        {
            cout<<"recv message after send error";
        }
    }
    catch (boost::system::system_error &e)
    {
        cout << "process failed:" << e.what() << endl;
    }
    if(nSendlenth != str_sendmsg.size())
    {
        std::cout<<"send error:"<<nSendlenth<<std::endl;
    }
    if(udp_socket.is_open())udp_socket.close();

return ret;
 }

时间: 2024-11-05 06:47:19

boost::asio::io_service 超时设置的相关文章

boost::asio::io_service(之一)

boost::asio::io_service /// Provides core I/O functionality. /** * The io_service class provides the core I/O functionality for users of the * asynchronous I/O objects, including: * io_service类为下面的异步对象提供了核心的I/O操作函数 * * @li boost::asio::ip::tcp::socke

Boost::asio io_service 实现分析

io_service的作用 io_servie 实现了一个任务队列,这里的任务就是void(void)的函数.Io_servie最常用的两个接口是post和run,post向任务队列中投递任务,run是执行队列中的任务,直到全部执行完毕,并且run可以被N个线程调用.Io_service是完全线程安全的队列. Io_servie的接口 提供的接口有run.run_one.poll.poll_one.stop.reset.dispatch.post,最常用的是run.post.stop Io_se

boost asio io_service学习笔记

构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp. Dispatch和post的区别 Post一定是PostQueuedCompletionStatus并且在GetQueuedCompletionStatus 之后执行. Dispatch会首先检查当前thread是不是io_service.run/runonce/poll/poll_once线程,如果是,则直接运行. poll和run的区别 两者代码几乎一样,都是首先检查是否有outstan

boost::asio设置同步连接超时

boost::asio设置同步连接超时 CSDN上求助无果,只好用自创的非主流方法了.asio自带的例子里是用deadline_timer的async_wait方法来实现超时的,这种方法需要单独写一个回调函数,不利于把连接和超时封装到单个函数里.传统的Winsock编程可以先把socket设为非阻塞,然后connect,再用select来判断超时,asio也可以这样做,唯一“非主流”的是asio里没有一个类似select的函数,所以得调用原始的Winsock API,也就牺牲了跨平台: #inc

boost::asio的io_service处理过程

1.主线程定义回调对象 2.调用io object的操作 3.io object会另开线程,定义opertion op来执行操作,同时将回调对象加到op的do_complete上.进行操作 4.完成操作加入完成队列 5.io_service线程循环从完成队列取事件,调用其事件对应的回调函数 Operation 还记得前面我们在分析resolver的实现的时候,挖了一个关于operation的坑?为了不让自己陷进去,现在来填吧:接下来我们就来看看asio中的各种operation. 和前面提到过的

Boost.ASIO简要分析-5 多io_service

5. 多io_service 前面那篇讲到了多线程的用法.这篇讲一下多io_service的用法,大家可参考下官方提供的HTTP Server 2(an io_service-per-CPU)这个例子. 官方提供的例子中,使用方法很简单,建立一个io_service_pool,然后对每一个io_service开一个线程去让它跑起来(毕竟,io_service::run这个函数在有任务的时候会一直工作的,只有开多个线程才做到不影响别的io_service).当然,我们也可以为每个io_servic

boost.asio系列——io_service

IO模型 io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象). asio::io_service io_service;    asio::ip::tcp::socket socket(io_service); 在asio框架中,同步的io主要流程如下: 应用程序调用IO对象成员函数执行IO操作 IO对象向io_service 提出请求. io_service 调用操作系统的功能执行连接操作. 操

Boost.Asio技术文档

Christopher Kohlhoff Copyright ? 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完

boost::asio译文

Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完