boost::asio要设置连接超时(是同步连接connect,不是async_connect),除了用deadline_timer::async_wait之外,还有没有其它方法?
我要把连接和超时写在同一个函数里处理,而deadline_timer::async_wait需要另外写一个回调函数,很不爽。

解决方案 »

  1.   

    小小顶一下,希望熟悉boost::asio的朋友来帮个忙
      

  2.   

    同步的connect肯定不能做超时处理啊
    它占了线程空间啊
    所以你还是得用deadline_timer::async_wait
      

  3.   


    一个一个来,先把asio搞透了再去学习ACE
    嗯,理论上是这样,但是有没有什么变通的方法来模拟“同步”超时。
    就像Winsock的connect一样,可以先把socket设为非阻塞,然后connect,再用select来判断超时,asio虽然也可以设为非阻塞,但是找不到一个和select对应的函数。
      

  4.   

    我也在关注此问题, 好象不可以;
    BOOST异步超时的取消操作又只能是close();
    用惯select, 再用asio是有点晕, 但是如果所有流程都是异步, 就没有什么问题了;
      

  5.   

    mutex _mutex;
    deadline_timer _timer;
    condition_variable_any _cond;bool ImpHandler::Connect()
    {
        _pSock = sock_ptr(new tcp::socket(_service));    tcp::endpoint ep(boost::asio::ip::address_v4::loopback(), 6500);
        _pSock->async_connect(ep, bind(&ImpHandler::Handle_Connected,
            shared_from_this(), placeholders::error, _pSock));    _timer.expires_from_now(posix_time::seconds(5));
        _timer.async_wait(bind(&ImpHandler::Handle_Timeout,
                               shared_from_this()));    boost::mutex::scoped_lock lock(_mutex);
        _cond.wait(_mutex);
        return true;
    }void ImpHandler::Handle_Connected(const system::error_code ec, sock_ptr psock)
    {
        if (!ec)
        {
           do whatever you want
        }
        else
            _timer.cancel();
    }void ImpHandler::Handle_Timeout()
    {
        _pSock->close();
        _cond.notify_one();
    }