2012-09-20 5 views
0

ASIO 부스트 라이브러리에 문제가 있습니다. 문제는 비동기 함수입니다.ASIO 라이브러리 - 핸들러가 호출되지 않음

이것은 간단한 서버 코드입니다.

void handle_accept(const boost::system::error_code& error) 
{ 
    std::cout << "Someone connected" << std::endl; 
} 

void handle_read(const boost::system::error_code& error) 
{ 
    printf("Message: %s \n", somedata); 
} 

int main() 
{ 

std::cout << "Starting server ....\n" << std::endl; 

try 
{ 
    boost::asio::io_service io_service; 
    tcp::socket mysocket(io_service); 
    tcp::acceptor myacceptor(io_service, tcp::endpoint(tcp::v4(), 5000)); 

    myacceptor.async_accept(mysocket, boost::bind(&handle_accept, boost::asio::placeholders::error)); 
    mysocket.async_receive( boost::asio::buffer(somedata, 1024) , boost::bind(&handle_read, boost::asio::placeholders::error)); 
    io_service.run(); 

    std::cout << "END. \n" << std::endl; 
    sleep(5); 

} catch (std::exception& e) 
{ 
    std::cerr << "Exception: " << e.what() << "\n"; 
} 
return 0; 

}

여기 그래서

int main() 
{ 
std::cout << "Starting client ....\n" << std::endl; 

try 
{ 
boost::asio::io_service io_service; 

tcp::resolver resolver(io_service); 
tcp::resolver::query query(tcp::v4(), "localhost", "5000"); 
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); 
tcp::socket mysocket(io_service); 

boost::asio::connect(mysocket, endpoint_iterator); 

sleep(5); 
sprintf(somedata, "This is a message i sent."); 
mysocket.send(boost::asio::buffer(somedata, 1024) ); 

} catch (std::exception& e) 
{ 
    std::cerr << "Exception: " << e.what() << "\n"; 
} 
return 0; 
} 

클라이언트 코드, 그것은 작동하는 방법. 서버는 클라이언트와의 연결을 기다려야하며 클라이언트가 연결되면 handle_accept를 호출해야합니다. 클라이언트가 연결되면 handle_accept가 실제로 호출되지만 데이터가 수신되지 않는 경우에도 handle_read가 호출됩니다. 왜 ? 클라이언트는 연결 한 후 5 초 후에 데이터를 보냅니다.

대단히 감사합니다.

+0

일반적으로 'handle_accept' 함수 내에서 수신/송신주기를 시작합니다. Asio [tutorial] (http://www.boost.org/doc/html/boost_asio/tutorial.html) 및 [examples] (http://www.boost.org/doc/html/boost_asio/examples)를 확인하십시오. html). – Xeo

+0

핸들러가 호출되었다는 사실이 그것이 성공했다는 것을 암시하지 않기 때문에 핸들러의 오류 코드도 확인해야합니다. –

답변

4

대기 시간이 없기 때문에 기다릴 수 없어 즉시 수신이 완료됩니다. TCP 수신 대기 소켓에서는 데이터가 수신되지 않습니다. 연결된 소켓에서만 async_receive으로 전화하십시오.

+0

그래서 클라이언트가 연결되면 handle_accept가 호출 될 때 async_receive를 호출해야합니다. – wh1sp3r

+0

예. 그리고 일반적으로 수신 핸들러가 반환되기 전에 다시 호출합니다. –

+0

감사합니다. 정말 효과적입니다. – wh1sp3r

관련 문제