簡體   English   中英

async_read_until:緩沖區空間不足或隊列已滿

[英]async_read_until: insufficient buffer space or queue is full

我正在將應用程序從使用Juce異步I / O轉換為Asio。 第一部分是重寫從同一台機器上的另一個應用程序接收流量的代碼(這是一個Lightroom Lua插件,可在端口58764上發送\\n分隔的消息)。 每當我使用C ++程序成功連接到該端口時,都會得到一系列錯誤代碼,都相同:

由於系統缺少足夠的緩沖區空間或隊列已滿,無法對套接字執行操作。

有人可以指出我的錯誤嗎? 我可以看到套接字已成功打開。 我已將其從整個程序中簡化為一個最小的示例。 我也嘗試使用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立即返回。 這就是“異步”的意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM