我正在学习Boost.Asio。 我定义了一个具有客户端和服务器角色的类:

  • 我可以创建连接,发送请求和接收响应(客户端角色)。
  • 我可以接受请求并发送对这些请求的响应(服务器角色)。
  • 我还可以创建订阅:创建连接,发送订阅请求并等待响应。 如果远程端点接受了请求,它将通过此​​连接定期向我发送数据。

我希望能够在订阅后发出请求并接收响应,但是当我收到响应时出现了一个问题:在同一时间等待的套接字同时收到了订阅和响应。

有时会有死锁,有时我在等待响应时得到订阅,...

要阅读,我使用以下功能:

void async_receive_subscription(const socket& the_socket, read_handler_signature handler)
{
    auto self( this->shared_from_this() );

    boost::asio::async_read(
        the_socket.get(),
        boost::asio::buffer( my_buffer ),
        [this, self, the_socket, my_buffer, handler]
        ( const boost::system::error_code& error,
          std::size_t bytes_transferred )
        {
            the_socket.get().get_io_service().post(
                std::bind(
                handler,
                error,
                bytes_transferred,
                the_socket,
                my_buffer
                )
            );
            // Read the next subscription.
            async_receive_subscription(the_socket, handler);
        }
    );
}

void async_receive(const socket& the_socket, read_handler_signature handler)
{
    auto self( this->shared_from_this() );

    boost::asio::async_read(
        the_socket.get(),
        boost::asio::buffer( my_buffer ),
        [this, self, the_socket, my_buffer, handler]
        ( const boost::system::error_code& error,
          std::size_t bytes_transferred )
        {
            the_socket.get().get_io_service().post(
                std::bind(
                handler,
                error,
                bytes_transferred,
                the_socket,
                my_buffer
                )
            );
        }
    );
}

是否可以期望同一套接字有两个响应? 是否可以使用任何同步机制来避免此问题?

谢谢。

===============>>#1 票数:2 已采纳

确保async_read恰好引起处理程序的一次调用。

在调用此处理程序之前,不得再次调用async_read。

题:

  1. 您是否在多个线程中运行io_service? 如果是这样,则需要将处理程序传递给asio :: strand。

  ask by Juan Solo translate from so

未解决问题?本站智能推荐:

2回复

不好的boost.ASIO性能

我在Windows上使用boost :: asio进行了一个非常简单的服务器/客户端性能测试,它似乎表现得非常糟糕。 我希望我只是错误地使用该库,并希望得到任何建议。 我有一个会话类,它写一个消息长度,然后写一条消息,然后等待读取消息长度,然后读取一条消息,并一直反复不停地这样做。 当
2回复

具有boost.Asio的多线程服务器

我正在尝试使服务器接收并处理许多连接。 我认为最好将每个连接放在线程中,但是我不知道该怎么做,因为我仍然不知道如何告诉班级“我收到一个新的连接,将其放入线程”。 我很困惑,仍然在这里没有找到其他帖子。 请帮我。 观察员:我有一个提示,提示会创建一堆连接,然后等待客户端,但是我不想这样
3回复

Boost.Asio socket析构函数关闭连接?

boost::asio::ip::tcp::socket的析构函数到底是做什么的? 我不知道,即使在浏览Boost文档和源代码之后,如果我需要使用它 在打电话之前 我是否需要手动关闭套接字,或者析构函数是否处理此问题?
2回复

Boost.Asio解析器的结果不同

我有一个罐装再现boost::asio::ip::tcp::resolver::resolve()每5秒在localhost上调用boost::asio::ip::tcp::resolver::resolve() 。 它计算返回的端点数,并将该值与上一次迭代进行比较。 样本会议
3回复

在Boost.Asio请求期间检测中止的连接[重复]

可能重复: 如何检查Boost.Asio中的套接字是否已关闭? 是否有确定的方法来确定asio框架中是否关闭TCP连接的另一端而不发送任何数据? 使用Boost.asio进行服务器进程时,如果客户端在服务器响应请求之前超时或以其他方式断开连接,则服务器在完成请求并生成要发送
1回复

使用Boost.Asio读取所需的字节数

我只是在创建一个非常简单的C ++类,为我提供了一些方法,例如connect()和read() ,而不是公开所有Boost.Asio套接字调用。 现在,我正在尝试找出如何创建仅读取所需字节数的方法: 不幸的是,我没有在Boost.Asio中找到read_byte函数。 我不想删除
2回复

无法在构造函数中使用boost.asio解析器

我有一个类,其属性定义如下: 还有我定义的构造函数实现: 在这里,在构造函数中,我定义了几乎所有需要定义的属性。 但是我有一个我从未在完整的.cpp文件中拥有的问题:当我在构造函数中定义解析器时,编译器会说我遇到了一个错误: 我不明白为什么,因为我用常规的东西!
5回复

如何在Boost.Asio中检查套接字是否已关闭?

检查套接字是否在连接的远程端关闭的最简单方法是什么? socket::is_open()返回true,即使它在远程端关闭(我使用的是boost::asio::ip::tcp::socket )。 我可以尝试从流中读取并查看它是否成功,但我必须更改程序的逻辑以使其以这种方式工作(我不希望在
1回复

绑定和连接的Boost.Asio数据报(UDP)套接字

我在理解Boost.Asio(使用v1.49.0) boost::asio::ip::udp::socket套接字背后的概念时遇到了问题。 首先,我要解释一下我想要实现的目标: 我将Boost.Asio套接字隐藏在一个非常简单的接口( Pure Abstract Base Cla
2回复

Boost.Asio:socket :: close不取消aysnc_read_some

我有一个执行async_read_some的boost套接字: 当我的Session类被删除时, socket_.close() 。 我认为这将取消async_read_some并调用Session::handle_read并显示错误。 然而,情况并非如此,并且正在查看basic