async_read_until: 缓冲区不足 space 或队列已满
async_read_until: insufficient buffer space or queue is full
我正在将应用程序从使用 Juce 异步 i/o 转换为 asio。第一部分是重写从同一台机器上的另一个应用程序接收流量的代码(它是一个 Lightroom Lua 插件,在端口 58764 上发送 \n
分隔消息)。每当我用我的 C++ 程序成功连接到那个端口时,我都会收到一系列错误代码,都是一样的:
An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
有人可以指出我的错误吗?我可以看到套接字已成功打开。我已将其从我的完整程序缩减为一个最小示例。我也用 connect
而不是 async_connect
尝试过,但遇到了同样的问题。
#include <iostream>
#include "asio.hpp"
asio::io_context io_context_;
asio::ip::tcp::socket socket_{io_context_};
void loop_me()
{
asio::streambuf streambuf{};
while (true) {
if (!socket_.is_open()) {
return;
}
else {
asio::async_read_until(socket_, streambuf, '\n',
[&streambuf](const asio::error_code& error_code, std::size_t bytes_transferred) {
if (error_code) {
std::cerr << "Socket error " << error_code.message() << std::endl;
return;
}
// Extract up to the first delimiter.
std::string command{buffers_begin(streambuf.data()),
buffers_begin(streambuf.data()) + bytes_transferred};
std::cout << command << std::endl;
streambuf.consume(bytes_transferred);
});
}
}
}
int main()
{
auto work_{asio::make_work_guard(io_context_)};
std::thread io_thread_;
std::thread run_thread_;
io_thread_ = std::thread([] { io_context_.run(); });
socket_.async_connect(asio::ip::tcp::endpoint(asio::ip::address_v4::loopback(), 58764),
[&run_thread_](const asio::error_code& error) {
if (!error) {
std::cout << "Socket connected in LR_IPC_In\n";
run_thread_ = std::thread(loop_me);
}
else {
std::cerr << "LR_IPC_In socket connect failed " << error.message() << std::endl;
}
});
std::this_thread::sleep_for(std::chrono::seconds(1));
socket_.close();
io_context_.stop();
if (io_thread_.joinable())
io_thread_.join();
if (run_thread_.joinable())
run_thread_.join();
}
您正在尝试同时启动无限数量的异步读取操作。在上一个异步读取完成之前,您不应该开始新的异步读取。
async_read_until
returns 立即,即使尚未收到数据。这就是 "async".
的意义所在
我正在将应用程序从使用 Juce 异步 i/o 转换为 asio。第一部分是重写从同一台机器上的另一个应用程序接收流量的代码(它是一个 Lightroom Lua 插件,在端口 58764 上发送 \n
分隔消息)。每当我用我的 C++ 程序成功连接到那个端口时,我都会收到一系列错误代码,都是一样的:
An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.
有人可以指出我的错误吗?我可以看到套接字已成功打开。我已将其从我的完整程序缩减为一个最小示例。我也用 connect
而不是 async_connect
尝试过,但遇到了同样的问题。
#include <iostream>
#include "asio.hpp"
asio::io_context io_context_;
asio::ip::tcp::socket socket_{io_context_};
void loop_me()
{
asio::streambuf streambuf{};
while (true) {
if (!socket_.is_open()) {
return;
}
else {
asio::async_read_until(socket_, streambuf, '\n',
[&streambuf](const asio::error_code& error_code, std::size_t bytes_transferred) {
if (error_code) {
std::cerr << "Socket error " << error_code.message() << std::endl;
return;
}
// Extract up to the first delimiter.
std::string command{buffers_begin(streambuf.data()),
buffers_begin(streambuf.data()) + bytes_transferred};
std::cout << command << std::endl;
streambuf.consume(bytes_transferred);
});
}
}
}
int main()
{
auto work_{asio::make_work_guard(io_context_)};
std::thread io_thread_;
std::thread run_thread_;
io_thread_ = std::thread([] { io_context_.run(); });
socket_.async_connect(asio::ip::tcp::endpoint(asio::ip::address_v4::loopback(), 58764),
[&run_thread_](const asio::error_code& error) {
if (!error) {
std::cout << "Socket connected in LR_IPC_In\n";
run_thread_ = std::thread(loop_me);
}
else {
std::cerr << "LR_IPC_In socket connect failed " << error.message() << std::endl;
}
});
std::this_thread::sleep_for(std::chrono::seconds(1));
socket_.close();
io_context_.stop();
if (io_thread_.joinable())
io_thread_.join();
if (run_thread_.joinable())
run_thread_.join();
}
您正在尝试同时启动无限数量的异步读取操作。在上一个异步读取完成之前,您不应该开始新的异步读取。
async_read_until
returns 立即,即使尚未收到数据。这就是 "async".