【问题标题】:Error when boost::asio::writeboost::asio::write 时出错
【发布时间】:2012-12-28 19:47:59
【问题描述】:

我使用 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++

【问题讨论】:

  • 消息是什么?这不可能是错误的全部。
  • @usr,错误代码10009,类别system

标签: c++ sockets boost


【解决方案1】:

提供的示例代码中没有 TCP 连接调用。该错误可能来自尝试写入未连接的套接字。对于服务器,需要accept。 (请忽略这一点,以防套接字初始化发生在您未显示的某些代码中)。

将异步调用(例如async_read)与阻塞调用(例如write)混合使用非常少见。最好选择异步调用或阻塞调用,不要混合使用。

您没有检查handle_read 中的错误代码。如果async_read 失败,handle_read 中的阻塞write 也很可能失败。阻塞write会在失败时抛出异常。

我建议研究 asio 文档中的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2018-05-02
    • 2013-01-30
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多