6

在一天的大部分时间里,我一直在努力实现这一目标,我真诚地感谢任何帮助。我的两个应用程序、客户端和服务器都开始抛出“向量下标超出范围”异常。

如何正确地做这件事?


还在努力解决这个问题,有人吗?

据我所知,我应该创建一个

boost::asio::basic_stream_socket stream; 然后调用:

stream.send(boost::asio::buffer(data));?

我想完全有可能异步进行吗?basic_stream_socket::send(): vs. basic_stream_socket::write_some()vs.之间有什么区别 basic_stream_socket::async_write_some()

basic_stream_socket::receive()baic_stream_socket::read_some()对 对basic_stream_socket::async_read_some()?

我假设send()&receive()是我希望确保 100% 的数据被发送/接收时可以调用的方法 - 以阻塞套接字为代价?

我假设write_some()&read_some()是当我不确定是否 100% 的数据被发送/接收时我可以调用的方法 - 同时仍然阻塞套接字?

我假设async_read_some()&async_write_some()是不阻塞套接字的方法,它们可以读/写任何东西?

4

2 回答 2

5

假设您创建了一个并尝试发送vector<char> 数据

stream.send(boost::asio::buffer(data));

boost:asio::buffer

于 2009-06-09T13:56:41.863 回答
0

我对提升 asio 也很陌生,但这是我的答案:

函数名称以 async_ 开头的函数需要一个回调函数作为参数,该函数将在操作完成时调用。也就是说,函数 async_write_some() 不会阻塞,而是立即返回,当操作完成时,调用回调函数。

据我了解,您的假设是正确的。但是,使用函数 async_write_some 等,您有一个回调函数,它将传输的字节数作为参数。

例如,这里我有一个从套接字读取的函数:

boost::asio::async_read(
    *socket_,
    boost::asio::buffer(read_msg_.body(), read_msg_.body_length()),
    boost::bind(
        &sender::handle_read_content,
        this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred
    )
);

里面的回调函数是handle_read_content,看起来是这样的:

void sender::handle_read_content(
    const boost::system::error_code& err,
    std::size_t bytes_transferred
)

一开始我读了这个非常好的教程: Boost Asio

于 2011-05-12T18:26:25.657 回答