【问题标题】:boost::asio::async_write from outside class来自外部类的 boost::asio::async_write
【发布时间】:2012-08-12 18:00:56
【问题描述】:

如果使用 echo 服务器的示例使用 boost.asio 对 tcp 服务器进行编程,我已经修改了它的一些代码以满足我想要处理传入数据并发回结果的要求,我使用了一个类套接字处理“socket.h”,我想为文件“handler.h”中的数据创建另一个处理程序,我现在的问题是如何将数据传递给handler.h中的函数并从这个函数发回数据通过socket.h ??

socket.h

#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <json/json.h>
#include "handler.h"

using namespace std;
using boost::asio::ip::tcp;

class session {
public:
    session(boost::asio::io_service& io_service) : socket_(io_service) {}
    tcp::socket& socket() { return socket_; }

    /* listen for first input data after connection established */
    void start() {
        socket_.async_read_some(boost::asio::buffer(data_, max_length),
        boost::bind(&session::handleIncome,this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred)); }

    /* handle incoming data */
    void handleIncome(const boost::system::error_code& error, size_t bytes_transferred) {
        /* data is recieved in var data_ */
            if (!error) {   
            /********************* Data Handler ****************************/

                     callHandler(data_); //this is in handler.cpp

            /**************************************************************/
        } else { delete this; } }

    /* get more input */
    void getIncome(const boost::system::error_code& error) {
        if (!error) {
            socket_.async_read_some(boost::asio::buffer(data_, max_length),
            boost::bind(&session::handleIncome, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred)); }
    else { delete this; } }

    /* send outcome back to client */
    void sendOutcome(const std::string dout, size_t bytes_out) {
        boost::asio::async_write(socket_,boost::asio::buffer(dout, bytes_out),
        boost::bind(&session::getIncome, this,boost::asio::placeholders::error)); }

private:
    tcp::socket socket_;
    enum { max_length = 1024 };
    char data_[max_length];
};

class DServer {
public:
    DServer(boost::asio::io_service& io_service, short port)
    :io_service_(io_service),
    acceptor_(io_service, tcp::endpoint(tcp::v4(), port))

    {
        session* new_session = new session(io_service_);
        acceptor_.async_accept(new_session->socket(),
        boost::bind(&DServer::handle_accept,this,new_session,boost::asio::placeholders::error));
    }

    void handle_accept(session* new_session,const boost::system::error_code& error) {
    if (!error) {
        new_session->start();
        new_session = new session(io_service_);
        acceptor_.async_accept(new_session->socket(),boost::bind(&DServer::handle_accept, this, new_session,boost::asio::placeholders::error));}
    else { delete new_session; } }

private:
    boost::asio::io_service& io_service_;
    tcp::acceptor acceptor_;
};

handler.cpp

void callHandler(string data) {
    /* here i want to process data and after that i want to send back the result to the same client ofcourse using the function sendOutcome() in the socket.h file */
}

【问题讨论】:

    标签: c++ boost boost-asio shared-ptr boost-thread


    【解决方案1】:

    从函数返回数据最常见的方法是返回它:

    string callHandler(string data);
    
    sendOutcome(callHandler(data_));
    

    如果您需要更大的灵活性(例如,发送多个响应,或对套接字执行其他操作),那么要么传递对套接字的引用,要么传递对 session 对象的引用(可能使用抽象接口将其与类实现分离)。

    【讨论】:

      【解决方案2】:

      首先,您必须确保您已收到所需的所有数据。即使整个请求大得多,您的处理程序也应该处理以 bytes_transferred 为 1 调用 handleIncome() 回调的情况。

      当然,您应该将读取回调用作 async_write() 函数的参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 2021-03-01
        • 1970-01-01
        • 2015-04-19
        相关资源
        最近更新 更多