2012-09-20 85 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 [教程](http://www.boost.org/doc/html/boost_asio/tutorial.html)和[示例](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

相關問題