2017-03-21 11 views
0

나는 boost/asio로 설정된 UDP 서버를 가지고 있습니다 (나는 the example을 복사하고 몇 가지를 변경했습니다).작업 취소 부스트 asio async_receive_from

udp_server.hpp

using boost::asio::ip::udp; 

class udp_server { 
public: 
    udp_server(boost::asio::io_service&, int); 

private: 
    boost::array<char, 256> recBuffer; 

    udp::socket socket_; 
    udp::endpoint remote_endpoint_; 

    void start_receive(); 

    void handle_receive(const boost::system::error_code&, std::size_t); 

    void handle_send(boost::shared_ptr<std::string> /*message*/, 
     const boost::system::error_code& /*error*/, 
     std::size_t /*bytes_transferred*/) 
    {} 
}; 

udp_server.cpp

udp_server::udp_server(boost::asio::io_service& io_service, 
         int port) 
    : socket_(io_service, udp::endpoint(udp::v4(), port)) { 
    serverNotifications.push_back("UDP Server class initialized."); 
    start_receive(); 
} 

void udp_server::start_receive() { 
    socket_.async_receive_from(
      boost::asio::buffer(recBuffer), 
      remote_endpoint_, 
      boost::bind(&udp_server::handle_receive, 
         this, 
         boost::asio::placeholders::error, 
         boost::asio::placeholders::bytes_transferred)); 
    serverNotifications.push_back("Starting to receive UDP Messages."); 

} 

void udp_server::handle_receive(const boost::system::error_code& error, 
           std::size_t size) { 
    serverNotifications.push_back("RecFrom: " + remote_endpoint_.address().to_string()); 
    if (!error) { 
     // I do data stuff here 
    } else { 
     errors.push_back("Handle Receive error: " + error.message()); 
    } 
} 

으로 서버를 초기화 한 후 :

try { 
    udp_server server(io_service, ApplData.PORT, (size_t)ApplData.BUFLEN); 
} catch (std::exception& e) { 
    // error handling 
} 

하고 실행 아래는 코드입니다 w

  • 내 콜백 함수 handle_receive
    • (연결없이 일명 단지 내 노트북)를 전체 네트워크에 보내지고있는 UDP 메시지없이 호출됩니다 : i 번째 다른 함수에서 별도의 시도 캐치에 io_service.run() 나는 몇 가지 문제를 얻을 수 error.message() 반환
    • remote_endpoint_.address().to_string() 반환을 "작업 취소" "acfc : 4000 : 0 : 0 : 7800 : % 2885986016"나는 유용한 무언가로 식별 할 수
  • 또한 내 io_service이 항상 멈추고 있다는 것을 알았지 만, 내 이해에서 항상 실행해야합니다.

나는 이미 shared_from_this ptr와 콜백 함수 바인딩이 참조하는 생각,하지만 난 내 프로그램을 떠날 때까지 나는 udp_server 클래스의 실제 인스턴스를 갖고 있기 때문에 나는 그것을 할 수있는 좋은 이유를 생각할 수 없다.

누군가이 오류가 발생했음을 설명 할 수 있습니까?이 오류가 내 코드에 대해 알려주거나 피할 수있는 방법을 설명 할 수 있습니까?

답변

0

Nevermind, Rubberduck 디버깅으로 충분했습니다. 방금 읽은 행

하지만 내 프로그램을 떠날 때까지 나는 udp_server 클래스의 실제 인스턴스가 있기 때문에 그럴만 한 이유가 있다고 생각할 수 없습니다.

실제로 주목을받지 못했습니다. 오류가 있습니다.