C ++跨平台超时读取

时间:2013-11-06 06:59:40

标签: c++ boost cross-platform boost-asio

我正在为AI competition竞争机器人实施测试服务器,机器人通过标准输入/输出与服务器通信。机器人只有很长的转弯时间。在之前的AI竞赛中,我在Java中编写了服务器,并使用BlockingQueue和阻塞读取/写入进程流的线程来处理它。

本次比赛期待使用C ++。我找到了Boost.Process和Boost.Asio但据我所知,Asio库没有办法超时等待读取的时间。它是围绕使用回调函数设计的,告诉您读取何时完成。虽然我想阻止,但最大超时。我可以使用特定于平台的API(例如select)来寻找更多跨平台解决方案。有什么建议吗?

编辑:为了澄清我想要一个BotConnection类来处理与具有两种方法的bot进程通信,例如:string readLine(long timeoutInMilliseconds)和void writeLine(string line,long timeoutInMilliseconds)。因此调用代码就像使用阻塞调用一样编写,但可以超时(抛出异常或更改上面的方法签名,以便在操作完成或超时时返回成功的标志)

2 个答案:

答案 0 :(得分:0)

您可以创建跟踪超时的计时器对象。一种典型的方法是使用异步处理程序创建常规计时器。每次触发时,您都会迭代连接对象,寻找那些没有传输任何数据的对象。在您的连接读取处理程序中,您将对象标记为已接收数据。在粗略的伪代码中:

timer_handler:
  for cnx in connections:
    if cnx.recv_count > 0:
      cnx.recv_count = 0
      cnx.idle_count = 0
      continue

    cnx.idle_count += 1
    if cnx.idle_count > idle_limit:
      cnx.close()


cnx_read_handler:
  cnx.recv_count += 1

注意:我没有使用过asio,但我确实检查过并且确实提供了计时器。

答案 1 :(得分:0)

没有可移植的方式来读取和写入超时的标准输入和输出。

  • Boost.Asio提供posix::stream_descriptor同步和异步读取和写入POSIX文件描述符,例如标准输入和输出,如posix chat client example中所示。虽然Boost.Asio不支持取消同步操作,但大多数异步操作都可以以便携方式取消。与Boost.Asio定时器结合的异步操作允许超时:在实体上启动异步操作,设置定时器,如果定时器到期,则在实体上调用cancel()。有关详细信息,请参阅Boost.Asio timeout examples
  • Windows标准句柄不支持通过完成端口的异步I / O.因此,Boost.Asio的windows::stream_handle文档指出支持命名管道,但匿名管道和控制台流不支持。有一些未解决的问题,例如this,有关标准输入和输出句柄的异步I / O支持。由于缺乏异步支持,可能需要额外的线程和缓冲来从应用程序中抽象出特定于平台的行为。