gpt4 book ai didi

c++ - Asio 没有收到来自远程系统的回复

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:49 26 4
gpt4 key购买 nike

我正在编写一个应该监听域套接字的客户端。我打开同步连接,进行同步写入,我知道服务器发送了有效响应,因为我正在使用 socat 到 eavesdrop在 socket 上。

除了我的 asio::read() 被调用但从不返回任何数据。我传递给它的缓冲区总是空的。这是我的代码:

void operator>>(const vector<unsigned char> input, Socket &socket) {
const size_t size = input.size();
const size_t bytes = asio::write(socket.connection_socket, asio::buffer(input, size));
if (bytes != size) {
const std::error_code ec;
throw std::system_error(ec, fmt::format("Tried to send {0} bytes but sent {1} instead.", size, bytes));
}
string buffer;
asio::read(socket.connection_socket, asio::buffer(buffer));
std::cerr << buffer << std::endl;
}

这些是我用来连接到套接字的属性:

io_service run_loop;
stream_protocol::socket connection_socket;
datagram_protocol::endpoint domain_socket_ep;

Socket 是一个简单的类,它包装了所有 Asio 代码,其中声明了上面的运算符重载。

最佳答案

asio::read 函数将读取最多 asio::buffer_size(asio::buffer(buffer)) 字节。在你的情况下,buffer 是空的,所以它最多读取零字节。

Asio 永远不会调整您传递给它的缓冲区的大小,因此您需要将 buffer 的大小调整为您期望接收的最大大小。

此外,asio::read 函数实际读取的字节可能少于输入缓冲区的大小。它读取的实际大小从该函数返回。因此,如果您想准确地读/写可以放入缓冲区的字节数,您需要执行如下操作:

void read_to_buffer(asio::ip::tcp::socket& s, asio::buffer buffer) {
size_t read = 0;
size_t n = asio::buffer_size(buffer);
while (read < n) {
read += asio::read(s, buffer + read));
}
}

void write_from_buffer(asio::ip::tcp::socket& s, asio::buffer buffer) {
size_t written = 0;
size_t n = asio::buffer_size(buffer);
while (written < n) {
written += asio::write(s, buffer + written));
}
}

void operator>>(const vector<unsigned char> input, Socket &socket) {
// TODO: convert between host and network byte order
auto& s = socket.connection_socket;
{
const uint32_t size = input.size();
write_from_buffer(s, asio::buffer(&size, sizeof(size));
write_from_buffer(s, asio::buffer(input));
}
{
uint32_t size = 0;
read_to_buffer(s, asio::buffer(&size, sizeof(size)));
string payload(size, 'x');
read_to_buffer(s, asio::buffer(payload));
std::cerr << payload << std::endl;
}
}

关于c++ - Asio 没有收到来自远程系统的回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40129327/

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