gpt4 book ai didi

c++ - async_read_until 的 Lambda 不初始化长度参数

转载 作者:行者123 更新时间:2023-11-30 04:00:32 24 4
gpt4 key购买 nike

我正在尝试将 c++11 lambda 与 boost::asio::async_read_until 一起使用,如下所示:

void TCPSession::readData()
{
auto self(shared_from_this());
boost::asio::async_read_until(socket_, buffer_, "\r\n",
[this, self](const boost::system::error_code& ec, std::size_t length)
{
log()->debug("received %lu bytes && ec: %d", length, ec); //use boost::log for compile time checking
std::ostringstream ss;
ss << &buffer_;
log()->debug("Received data: %s",ss.str());
if (!ec){
log()->debug("We never get here!");
[... process data ...]
readData();
}
}
);
}

我观察到的是长度=0。 ec 被适本地设置为 boost EOF 代码。

当我将成员(即 buffer_)转换为字符串时,我也会看到数据。

任何有关初始化长度的建议都会有所帮助。

示例输出:

2014-10-09 14:47:56.968142 [tcp-session] debug: received 0 bytes && ec: asio.misc:2
2014-10-09 14:47:56.974593 [tcp-session] debug: Received data: test7.2.3.5 0.18722307655 2014-10-09 14:47:55.343591
test7.2.3.5 -0.0691607464759 2014-10-09 14:47:55.343837
test7.2.3.5 0.151471040421 2014-10-09 14:47:55.344017
test7.2.3.5 0.172789025585 2014-10-09 14:47:55.344211
test7.2.3.5 0.0409326066787 2014-10-09 14:47:55.344406

最佳答案

尝试

printf("received %lu bytes", length);

// ...
printf("Received data: %s", ss.str().c_str());

或者更好的是,

std::cout << "received " << length << " bytes\n";
// ...
std::cout << "Received data: " << ss.str();

%d 不是 size_t 的正确格式。 (这就是发明 C++ 的原因。几十年前)

注意:如果您启用警告 (-Wall -Wextra -pedantic),您的编译器会告诉您大部分内容

现在, docs say 那个

 // The number of bytes in the streambuf's get
// area up to and including the delimiter.
// 0 if an error occurred.

因此,由于 ec 是 EOF,这说明 length 也是 0。

下面的示例打印: Live On Coliru

received 0 bytes, ec: End of file
Received data: hello world
byebye

(假设响应服务器发送“hello world\n”);

完整示例:

#include <boost/asio.hpp>   
#include <boost/enable_shared_from_this.hpp>
#include <boost/make_shared.hpp>
#include <cstring>
#include <iostream>

struct TCPSession : boost::enable_shared_from_this<TCPSession>
{
void readData();

TCPSession(boost::asio::io_service& svc) : socket_(svc) {
using boost::asio::ip::tcp;
socket_.connect(tcp::endpoint { {}, 6767 });
}
boost::asio::ip::tcp::socket socket_;
boost::asio::streambuf buffer_;
};

void TCPSession::readData()
{
auto self(shared_from_this());
boost::asio::async_read_until(socket_, buffer_, "\r\n",
[this, self](const boost::system::error_code& ec, std::size_t length)
{
std::cout << "received " << length << " bytes, ec: " << ec.message() << "\n";

std::ostringstream ss;
ss << &buffer_;
std::cout << "Received data: " << ss.str();

if (!ec){
std::cout << "We never get here!";
//[... process data ...]
readData();
}

std::cout << "byebye\n";
}
);
}

int main()
{
boost::asio::io_service svc;
auto sess = boost::make_shared<TCPSession>(svc);

sess->readData();
svc.run();
}

关于c++ - async_read_until 的 Lambda 不初始化长度参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288318/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com