2012-08-16 11 views
0

echo 서버의 예제를 사용하여 boost.asio를 사용하여 tcp 서버를 프로그래밍하는 경우 들어오는 데이터를 처리하려는 내 요구 사항을 충족하도록 코드를 수정했으며 결과를 다시 보내, "socket.h"소켓 처리 클래스를 사용하고 "handler.h"파일의 데이터에 대해 다른 처리기를 만들고 싶습니다. 이제는 어떻게 문제를 해결할 수 있습니까? handler.h와 socket.h를 통해이 함수로부터 데이터를 다시 보낸다.외부 클래스의 boost :: asio :: async_write

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 */ 
} 

답변

2

이다를 반환하여 함수로부터 데이터를 리턴하는 가장 일반적인 방법 :

string callHandler(string data); 

sendOutcome(callHandler(data_)); 

더 많은 유연성이 필요한 경우 (예 : 소켓에 대한 참조를 전달하거나 session 객체에 대한 참조를 전달할 수 있습니다 (아마도 추상 인터페이스를 사용하여 클래스 구현과 분리됩니다).

0

우선, 필요한 모든 데이터를 수신했는지 확인해야합니다. 핸들러는 전체 요청이 훨씬 더 클 경우에도 bytesTransferred가 1 인 handleIncome() 콜백이 호출되는 시나리오에 대처해야합니다.

이 아니어야합니다.은 async_write() 함수의 매개 변수로 읽기 콜백을 사용하지 않아야합니다.

관련 문제