1

ソケットの処理にはboost:asioを使用しています。しかし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++
4

1 に答える 1

3

提供されているサンプル コードには、TCP 接続の呼び出しはありません。このエラーは、接続されていないソケットに書き込もうとしたことが原因である可能性があります。サーバーの場合はacceptが必要です。(表示されていないコードでソケットの初期化が発生した場合は、これを無視してください)。

async_read非同期呼び出し (例: ) とブロッキング呼び出し (例: )を混在させることは非常にまれwriteです。非同期呼び出しまたはブロック呼び出しのいずれかを選択し、それらを混在させないことをお勧めします。

でエラー コードを確認しませんhandle_read。が失敗した場合async_read、ブロックwriteインhandle_readも失敗する可能性が非常に高くなります。ブロッキングwriteは、失敗時に例外をスローします。

asio ドキュメントの例を調べることをお勧めします。

于 2012-12-28T20:54:47.577 に答える