不知道有没熟悉boost asio的,用async_read投递一个读请求,这个函数是要等读到指定长度的数据或者出错才返回,有没有办法设置一个参数让它超时返回?因为最近遇到一个网络环境很奇葩,好像async_read之后偶尔会一直不返回,很多其它用户都不会出现过

解决方案 »

  1.   

    说错了,应该是async_read之后回调函数不调用,对端是发数据了的,感觉是不是TCP都丢包了,而且出现这种情况后网卡就ping不通了
      

  2.   

    回调函数好像必须调用,出错了也得调用,除非你stop io_service。
    如果要提供这个功能,必须从io_service上下手,即提供一个取消异步调用的接口,这个接口并没有,而且就算提供了,怎么知道要取消哪一个异步调用呢?因为异步调用并没有返回一个id。
    实现还有一个难点,对于已经完成但还没有调用回调函数的异步调用,不好取消。至少asio未实现这样的功能,看看它的timer就知道了,timer虽然可以取消,但不保证取消之后,回调函数一定不回调。
      

  3.   

    我不是要取消回调,是让它到指定时间还不调用就立即返回并调用我的回调,你说的相反了,因为我现在担心对端一直不发数据或者数据已经丢失连接又没断开,导致我这里死等。 boost 的定时器可以解决?
      

  4.   

    只要找不到timed_async_read之类的函数,应该就不行了。
      

  5.   

    我不是要取消回调,是让它到指定时间还不调用就立即返回并调用我的回调,你说的相反了,因为我现在担心对端一直不发数据或者数据已经丢失连接又没断开,导致我这里死等。
     boost 的定时器可以解决?嗯,我用定时器dealine_timer解决但是又遇到点古怪问题