2017-10-02 1 views
0

소켓을 캡슐화했는데 문제가 발생했지만 async_readasync_write도 콜백 함수를 호출하지 않으며 그 이유를 이해할 수 없습니다.async, async_read 및 acync_write가 콜백을 호출하지 않습니다.

나는 async_read_some을 사용해 보았지만 같은 문제가있었습니다. 여기

내가 작성한 코드의 지금까지

#include <iostream> 
#include "socket.hpp" 

Socket::Socket() 
{ 
    boost::asio::ip::tcp::endpoint ep_tmp(boost::asio::ip::tcp::v4(), 4242); 

    endpoint = ep_tmp; 
    acceptor = new boost::asio::ip::tcp::acceptor(ios, endpoint); 
    tcp_socket = new boost::asio::ip::tcp::socket(ios); 
    acceptor->listen(); 
} 

Socket::~Socket() 
{ 
    delete(acceptor); 
    delete(tcp_socket); 
} 

void  Socket::get_connection() 
{ 
    acceptor->async_accept(*tcp_socket, [](const boost::system::error_code &ec) 
      { 
       std::cout << "Connection received." << std::endl; 
       if (ec) 
       std::cout << "Error " << ec << std::endl; 
      }); 
    this->exec(); 
} 

void  Socket::send(std::string &message) 
{ 
    async_write(*tcp_socket, boost::asio::buffer(message), 
      [](const boost::system::error_code &ec, 
     std::size_t bytes_transferred) 
      { 
     std::cout << "Sending datas." << std::endl; 
     if (ec) 
      std::cout << "Error " << ec << std::endl; 
     else 
      std::cout << bytes_transferred << " bytes transferred." << std::endl; 
      }); 
} 

void  Socket::receive(void) 
{ 
    char  *buf; 

    buf = (char *)malloc(sizeof(char) * 50); 
    buf = (char *)memset(buf, 0, 50); 
    async_read(*tcp_socket, boost::asio::buffer(buf, 50), 
     [](const boost::system::error_code &ec, 
     std::size_t bytes_transferred) 
     { 
      std::cout << "Receiving datas." << std::endl; 
      if (ec) 
     std::cout << "Error " << ec << std::endl; 
      else 
     std::cout << bytes_transferred 
       << " bytes transferred." << std::endl; 
     }); 
} 

void  Socket::exec(void) 
{ 
    ios.run(); 
} 

int  main() 
{ 
    Socket serv; 
    std::string data_test; 

    data_test = "Test\n"; 
    serv.get_connection(); 
    serv.send(data_test); 
    serv.exec(); 
    serv.receive(); 
    serv.exec(); 
    return (0); 
} 

나는 사람이 할 수있는 경우 가

정말 감사 할 것 C.

를 사용하지 않고 그것을 할 수있는 방법을 찾을 때까지 malloc 비트가 일시적 그 문제에 대해 나를 깨우 치라.

답변

0

나는 yuri와 함께있다 : 당신이하는 일을 알지 못한다면 non-async를 선호한다.

그것은 다음과 같을 수 있습니다 : 당신이 비동기 행동을하려는 경우 http://coliru.stacked-crooked.com/a/523a7828a9aee4b2

#include <boost/asio.hpp> 
#include <iostream> 

namespace ba = boost::asio; 
using ba::ip::tcp; 

class Socket { 
    public: 
    Socket() { acceptor.listen(); } 

    void get_connection(); 
    void exec(); 
    void send(std::string const &message); 
    void receive(void); 

    private: 
    ba::io_service ios; 
    tcp::endpoint endpoint{ tcp::v4(), 4242 }; 
    tcp::acceptor acceptor{ ios, endpoint }; 
    tcp::socket tcp_socket{ ios }; 
}; 

void Socket::get_connection() { 
    acceptor.accept(tcp_socket); 
    std::cout << "Connection received.\n"; 
} 

void Socket::send(std::string const &message) { 
    std::cout << "Sending datas.\n"; 
    auto bytes_transferred = ba::write(tcp_socket, ba::buffer(message)); 
    std::cout << bytes_transferred << " bytes transferred.\n"; 
} 

void Socket::receive(void) { 
    std::cout << "Receiving datas.\n"; 

    char buf[50] = { 0 }; 
    auto bytes_transferred = ba::read(tcp_socket, ba::buffer(buf)); 
    std::cout << bytes_transferred << " bytes transferred.\n"; 
} 

int main() { 
    Socket serv; 

    serv.get_connection(); 
    serv.send("Test\n"); 
    serv.receive(); 
} 

, 각 버퍼/연결 별 자원의 수명을 관리 할 수 ​​있습니다. 많은 예가 있습니다 (예 : 버퍼 수명의 위험에 http://coliru.stacked-crooked.com/a/95e2000e49b4db1d

여기 문서 또는
1

두 번째 이후의 전화는 io_service::run에 전화하기 전에 io_service::reset으로 전화해야한다. 그리고 현재의 접근 방식이 비동기 목적을 절대적으로 무마하기 때문에 동기 API를 대신 사용하고 싶을 것입니다.

관련 문제