【问题标题】:For boost-asio network programming whats the best approach for processing the response?对于 boost-asio 网络编程,处理响应的最佳方法是什么?
【发布时间】:2009-04-19 01:29:57
【问题描述】:

我是网络编程的新手,尤其是异步进程。 也可以从 boost-lib 开始

我正在实现一个类,以访问 imap-server。我可以发送和接收 一般的命令和响应

响应在类内的出队中排队。 我将简单的响应行放入队列中,以供进一步处理。

现在处理排队响应的最佳方式是什么?

  1. 一个额外的线程来检查(基于时间)队列是否有新条目?
  2. 每次将新条目推送到队列时都会进行回调吗?
    如何实现和集成此回调?

也许有人对此有一个简短的例子。

谢谢

【问题讨论】:

    标签: c++ network-protocols boost-asio asynchronous


    【解决方案1】:

    每次将新条目推送到队列时都会进行一些回调? 如何实现和集成这个回调?

    我假设您正在使用单线程同步连接。

    做这样的事情:

    class worker {
    
        deque<message> messages;
        bool is_writing_;
    
        push_message(message msg) {
            messages.push_back(msg);
            notify();
        }
    
        void notify()
        {
            if(!is_writing_) {
                is_writing_=true;
                init();
            }
        } 
    
        void init()
        {
            if(messages.empty()) { is_writing_=false; return; }
            messamge msg=messages.pop();
            convert_to_vector(v);
            async_write(socket,buffer(v),
                boost::bind(&worker::complete,this,placehoders::error));
        }
        void complete(error_code const &e)
        {
            if(!e) {
                init();
            }
            else { cleanup(); }
        }
    
    };
    

    注意!!!

    这是单线程实现。如果你想从其他线程通知你应该 不调用some_worker-&gt;push_message(msg),你应该使用ios服务:

    service.post(boost::bind(&worker::push_message,some_worker,msg));
    

    push_message 将从运行 ioservice 的同一线程中调用。

    【讨论】:

    • 连接自身是异步的,我认为worker应该在另一个线程中,所以我给你一个例子,看看我能走多远。我对应该如何开始的想法有误。现在它更清楚了,将响应放入一个新的对象中来完成这项工作。我只把它放在队列里谢谢
    • 我建议看一下示例并尝试实现一些简单的 TCP/IP clinet/server 以了解其工作原理,然后尝试做一些实际的事情。我必须注意,“worker”可能具有误导性——它更像是一个持有套接字并在其上执行所有 tcp/ip 的对象。
    【解决方案2】:

    实现队列处理器的一种可能方法是使用信号量。

    例如 pthread 条件类型 (description) 如果您在符合 POSIX 的平台上。

    您可以在后台等待 N 个“队列处理线程”。

    1. 每次将某样东西推入队列时,您的信号量都会发送它的信号。

      • 信号由休眠的“队列处理”线程接收,这些线程开始处理队列,因为它们知道自己有数据。

      • 当线程完成处理它的数据时,检查队列大小以查看它是否应该抓取其他东西,如果没有,则返回等待信号。

    【讨论】:

      猜你喜欢
      • 2016-11-24
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      相关资源
      最近更新 更多