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 초 후에 데이터를 보냅니다.
대단히 감사합니다.
일반적으로 '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
핸들러가 호출되었다는 사실이 그것이 성공했다는 것을 암시하지 않기 때문에 핸들러의 오류 코드도 확인해야합니다. –