2012-12-28 114 views
1

我使用boost:asio來處理套接字。但我有錯誤,當使用boost::asio::write funcion,在這裏我的代碼:boost :: asio :: write時出錯

tcp::socket socket_; 

Server(boost::asio::io_service& io_service) : socket_(io_service) {} 

tcp::socket& socket() 
{ 
    return socket_; 
} 

void Server::start() 
{ 
    startReadPacket(10); // example, client sends 10 bytes packet 
} 

void Server::startReadPacket(int size_to_read) 
{ 
    boost::asio::async_read(socket(), boost::asio::buffer(byteBuffer->GetBytes(), MAX_BUFFER_SIZE), boost::asio::transfer_at_least(size_to_read), boost::bind(&Server::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 
} 

void Server::handle_read(const boost::system::error_code& error, size_t bytes_transferred) 
{ 
    unsigned char data[2] = { 0x01, 0x24}; //for example 
    boost::asio::write(socket(), boost::asio::buffer(data, 2)); // this code throws exception below 
} 

錯誤:

> NewServer.exe!boost::throw_exception<boost::system::system_error>(const boost::system::system_error & e) Line 61 + 0x2e bytes C++ 
    NewServer.exe!boost::asio::detail::do_throw_error(const boost::system::error_code & err, const char * location) Line 38 + 0xd bytes C++ 
    NewServer.exe!boost::asio::write<boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::asio::mutable_buffers_1>(boost::asio::basic_stream_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > & s, const boost::asio::mutable_buffers_1 & buffers) Line 62 C++ 
    NewServer.exe!Server::handle_read(const boost::system::error_code & error, unsigned int bytes_transferred) Line 91 + 0x26 bytes C++ 
+0

什麼信息?這不可能是所有的錯誤。 – usr

+0

@usr,錯誤代碼'10009',類別'system' – Boris

回答

3

有中提供的示例代碼中沒有TCP連接呼叫。錯誤可能來自嘗試寫入未連接的套接字。在服務器的情況下,需要accept。 (如果套接字初始化發生在你沒有顯示的某些代碼中,請忽略此)。

將異步調用(例如async_read)與阻塞調用(例如write)混合是非常罕見的。選擇異步或阻止呼叫並且不要混合它們是一種很好的做法。

您不檢查handle_read中的錯誤代碼。如果async_read失敗,handle_read中的阻止write很可能也會失敗。阻塞write將在失敗時引發異常。

我會推薦學習asio文檔中的例子。