【问题标题】:Boost ASIO Network Timing IssueBoost ASIO 网络时序问题
【发布时间】:2012-11-27 06:48:57
【问题描述】:

我正在使用 boost::asio 来实现网络编程并遇到时间问题。目前,这个问题主要出在客户身上。

协议最初由服务器向用户返回一个日期时间字符串开始,客户端读取它。直到那部分它工作正常。但我还想要的是能够将命令写入服务器然后处理它们。为此,我使用了 io_service.post() 函数,如下所示。

io_service.post(boost::bind()); // bounded function calls async_write() method. 

由于某种原因,写入尝试发生在初始客户端/服务器通信之前,此时套接字尚未创建。我得到了错误的套接字描述符错误。

现在 io_service 的 run 方法确实在另一个线程中调用了。

当我在 post 方法之前放置一个 sleep(2) 命令时,它工作正常。

有没有办法同步这个,以便在执行任何发布的调用之前创建套接字。

【问题讨论】:

  • 你为什么不从 read 的完成处理程序中调用async_write,或者从“初始客户端/服务器通信”完成后调用的任何函数调用?看看 asio 示例。
  • 为什么投反对票?我的问题很简单,为什么我在设置实际套接字实例之前执行 post 命令?

标签: c++ networking boost boost-asio


【解决方案1】:

在使用boost::asio 创建套接字并建立连接时,您可以定义一个在这些操作完成或失败时调用的方法。所以,你应该在成功回调中触发你的“posted call”。

相关的方法和类是:

boost::asio::ip::tcp::resolver::async_resolve(...)
boost::asio::ip::tcp::socket::async_connect(...)

【讨论】:

  • 另一种解决方案是将有界函数和套接字创建函数发布在同一个strand 上,这样如果首先调用套接字创建函数,strand 会确保它会在执行第二个函数之前结束。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-04
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2019-11-13
    相关资源
    最近更新 更多