gpt4 book ai didi

c++ - 从套接字进行异步读取时出现 Heisenbug

转载 作者:太空狗 更新时间:2023-10-29 20:54:07 28 4
gpt4 key购买 nike

我在域套接字上调用 async_read,我的问题是有时我会获得数据,有时我没有,即使远程系统总是返回数据。如果我进行逐步调试,我似乎能够从套接字中读取。如果我自动化单元测试,它们似乎运行得太快而无法返回数据,这很奇怪,因为异步方法的全部目的是等待回复。

我将这些作为我的类的属性:

io_service run_loop;
stream_protocol::socket connection_socket;
datagram_protocol::endpoint domain_socket_ep;
vector<unsigned char>read_buffer;

我写:

void operator>>(const vector<unsigned char> input, shared_ptr<Socket>socket) {
asio::async_write(socket->connection_socket, asio::buffer(input), std::bind(&Socket::write_handler, socket, std::placeholders::_1, std::placeholders::_2));
socket->run_loop.reset();
socket->run_loop.run();
}

在写入回调中我做了一个读取:

void Socket::write_handler(const std::error_code &ec, const size_t size) noexcept {
const size_t avail = connection_socket.available();
if (!read_buffer.empty()) {
read_buffer.clear();
}
asio::async_read(connection_socket, asio::buffer(read_buffer, avail), std::bind(&Socket::read_handler, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}

我尝试将读取函数包装在 while(read_buffer.size() < avail) 中但这让我陷入了无限循环。

我肯定在这里遗漏了一些东西,我只是想不通什么,而且在逐步运行时这有效的事实只会让事情变得更糟。

最佳答案

在阅读方面:

你从不提 read_buffer 的类型.我们对什么知之甚少.clear()确实如此,但如果它确实如其名称所暗示的那样,则使用 asio::buffer(read_buffer, avail) 将是无效的没有事先 read_buffer.resize(avail)


为什么会有

void operator>>(const vector<unsigned char> input, shared_ptr<Socket>socket) {
asio::async_write(socket->connection_socket, asio::buffer(input), std::bind(&Socket::write_handler, socket, std::placeholders::_1, std::placeholders::_2));
socket->run_loop.reset();
socket->run_loop.run();
}

而不是例如

void operator>>(const std::vector<unsigned char> input, std::shared_ptr<Socket> socket) {
boost::system::error_code ec;
size_t transferred = boost::asio::write(socket->connection_socket, boost::asio::buffer(input), ec);
socket->write_handler(ec, transferred);
}

如果您不想要异步操作,请不要使用它们。这样至少简单了很多。以下示例将是合理的(如果您确保 io 的生命周期比使用它的任何套接字都长):

Live On Coliru

#include <boost/asio.hpp>

struct Socket {
boost::asio::io_service& svc;
boost::asio::ip::tcp::socket connection_socket;

Socket(boost::asio::io_service& svc) : svc(svc), connection_socket(svc) {}

void write_handler(boost::system::error_code ec, size_t bytes_transferred) {
}
};

void operator>>(const std::vector<unsigned char> input, std::shared_ptr<Socket> socket) {
boost::system::error_code ec;
size_t transferred = boost::asio::write(socket->connection_socket, boost::asio::buffer(input), ec);
socket->write_handler(ec, transferred);
}

int main(){
boost::asio::io_service io;
auto s = std::make_shared<Socket>(io);

std::vector<unsigned char> v { 100, 'a' };
v >> s;
}

关于c++ - 从套接字进行异步读取时出现 Heisenbug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40263127/

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