问题标签 [boost-asio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
782 浏览

c++ - 为什么这个简单的 Boost::asio 程序不能按预期工作?

我写了这个:

然后我在终端上写了 telnet localhost 1033。Telnet 说我已连接,但处理程序没有被调用(gdb 没有命中断点并且 coutS 没有效果)。如果我杀死程序 telnet 会说连接已关闭。所以似乎连接已经建立,但为什么处理程序没有被调用?

编辑:

奇怪的是,如果在 start() 中我将 ioservice.run() 放在 startAccept()之后,它会起作用。现在我想知道为什么这行得通......事实上后来我再次调用 start accept 并且它仍然有效,并且它是在 ioservice.run() 调用之后......

0 投票
2 回答
3827 浏览

c++ - 如何确定是否有数据可从 boost::asio 中的套接字读取?

我正在使用 Boost ASIO 库来编写 TCP 客户端程序。

当您连接时,该协议以横幅行开头,然后是“\r\n”我可以随时发送命令,就像 smtp。

但是,服务器也可以在我不要求时向我发送数据并且它以 '\r\n' 终止

我有这样一行来读取和解析初始连接横幅,这意味着,当我得到“\r\n”时停止阅读。

但是在不同的时间我想能够问这个问题,有可用的数据吗?如果有,请阅读它直到“\r\n”。我觉得我需要一个窥视功能,但我看不到它在哪里。

好的,也许我可以再次调用 async_read_until。但是考虑一下……它永远不会结束。继续阅读调试出现一次。显然,它一直在等待完成,但永远不会完成。

好的,我想我现在明白了。我没有看一个足够完整的例子来作为我的代码的基础。

它看起来像调用:

boost::asio::async_read_until(socket_, response_, "\r\n", boost::bind(&client::HandleReadRequest, this, boost::asio::placeholders::error)); 表示当response_缓冲区中出现\r\n时,会调用函数HandleReadRequest。我只需要调用 async_read_until 一次。除非调用了写请求,否则我需要再次读取......看起来......好吧,我至少现在可以工作了。

0 投票
2 回答
917 浏览

c++ - Asio 异步和并发

我正在boost::asio使用异步 TCP 连接编写一些代码。我不得不承认我对此有些怀疑。所有这些都与并发有关。这里有一些:

  • 如果我async_write在同一个套接字上启动两个或多个而不等待第一个完成会发生什么?处理程序(和async_write)会重叠还是asio提供序列化和同步?

  • async_connect与和相同的问题async_read。一般来说,从不同的线程调用这些函数是否安全(我不是在谈论使用不同的缓冲区,这是另一个问题......)。

0 投票
1 回答
7191 浏览

c++ - 更好的提升 asio 截止时间_定时器示例

我正在寻找一个更好的例子boost::asio::deadline_timer

给出的示例总是会超时并调用该close方法。我尝试调用cancel()一个计时器,但这会导致传入的函数async_wait立即被调用。

在异步 tcp 客户端中使用计时器的正确方法是什么?

0 投票
1 回答
6123 浏览

c++ - io_service::run() 的专用线程

我想提供一个io_service由一个全局线程驱动的全局。很简单,我只有线程体调用io_service::run()。但是,如果没有工作要做,那将不起作用,因为run( run_one, poll, ) 返回。poll_one但是,如果线程重复调用run(),它会在无事可做时忙循环。

我正在寻找一种方法来阻止线程,而 io_service 中没有任何工作要做。我可以在混合中添加一个全局事件,以便线程阻塞。但是,这将要求用户在io_service每次使用该服务时通知该事件。不是理想的解决方案。

注意:没有实际的全局变量,我从不使用并发事件我只是将问题简化为我的确切需要。真正的目标是一个asio::deadline_timer不需要io_service作为构造参数的子类。

0 投票
1 回答
16010 浏览

c++ - 提升 asio io_service.run()

我刚刚浏览了 asio聊天服务器示例。我的问题是关于他们对该io_service.run()功能的使用。该io_service.run()函数的文档说:

run() 函数一直阻塞,直到所有工作完成并且没有更多的处理程序要分派,或者直到 io_service 已停止。多个线程可以调用 run() 函数来建立一个线程池,io_service 可以从中执行处理程序。在池中等待的所有线程都是等效的,io_service 可以选择其中任何一个来调用处理程序。只有在调用 reset() 之后,run() 函数才可以安全地再次调用。

它说 run 函数将返回,我假设当它返回时,网络线程会停止,直到再次调用它。如果这是真的,那么为什么不在循环中调用 run 函数,或者至少不给它自己的线程?这个io_service.run()功能对我来说几乎是个谜。

0 投票
1 回答
1381 浏览

c++ - 在使用 boost::asio 和 boost::iostreams 加载异步非阻塞文件时需要帮助(或其他方式?)

我正在用 C++ 编写代码,并且正在尝试异步加载图像文件。经过一番研究,我发现一些关于使用 boost::asio 和 boost::iostreams 来做这件事的提及。但是, boost::asio 的文档和示例主要与套接字相关,因此对我没有多大帮助。

这是我需要的:

  • 异步加载文件并在加载完成后执行回调函数。(在我的例子中,回调函数使用 v8 javascript 引擎执行 javascript 函数对象)
  • 回调函数必须与主函数在同一线程中执行。(因为 v8 不是线程安全的。)
  • 需要在linux和windows上工作。(单独的实现是可以的)

所以,这样的事情会非常好:

该函数不应阻塞,并且在文件加载完成后,它应该运行“the_callback_function”。

编辑:正如 joshperry 指出的那样, boost::asio 可能无法调度回主线程。所以,我想我不必仅限于 boost::asio 和 boost:iostreams。任何可以帮助满足此要求的 c/c++ 库都应该没问题。谢谢!

0 投票
1 回答
2471 浏览

c++ - 一般提升 asio 流读取问题

我对在 asio 中如何将数据读入流中的工作方式感到有些困惑。我的主要问题是:

  1. 如果一台计算机同时进行多个异步写入,而接收计算机上只有一个异步读取,会发生什么情况。通过 TCP 协议,数据是否有可能交错?
  2. ASIO 库如何知道何时调用处理读取流中的新数据的处理程序?它会调用每个接收到的字节吗?当客户端断开连接?
  3. 有没有使用流的好(和简单)示例,而不是使用 asio 从 tcp 套接字读取的缓冲区?

谢谢。

0 投票
5 回答
49333 浏览

c++ - boost::asio 完全断开连接

有时 boost::asio 似乎在我想要它之前断开连接,即在服务器正确处理断开连接之前。我不确定这是怎么可能的,因为客户端似乎认为它完全发送了消息,但是当服务器发出错误时,它甚至没有读取消息头......在测试期间,这可能只发生五分之一,服务器收到客户端关闭消息,并干净地断开客户端。

错误:“现有连接被远程主机强行关闭”

客户端断开连接:

服务器:

0 投票
2 回答
2165 浏览

c++ - 帮助 async_read_until

我无法在此处记录的函数中实现第三个参数:http: //www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/async_read_until/overload4.html 我想要什么能够做的是使用 async_read_until 的第三个参数上的回调来检测完整块何时到达。我的数据包具有以下格式。

  • 1字节id(数据的语义)
  • unsigned int(数据中的字节数,因为某些数据块可以改变大小)
  • 有效载荷

查看文档中的示例代码,我有点困惑我应该如何提取一个字节,更不用说从开始和结束迭代器中提取一个无符号整数了。我已经将我的迭代器实例化为 typedef boost::asio::buffers_iterator< boost::asio::streambuf::const_buffers_type> iterator;

但即便如此我也不确定那是什么类型,因为我不知道 const_buffers_type 是什么。我关注了文档中的一些链接,发现它是“实现定义的”,但我想我可能是错的。所以我的两个具体问题是:

  1. 如何使用这两个迭代器来读取无符号整数?
  2. 这些迭代器指向什么类型?

谢谢!