问题标签 [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.
c++ - 为什么这个简单的 Boost::asio 程序不能按预期工作?
我写了这个:
然后我在终端上写了 telnet localhost 1033。Telnet 说我已连接,但处理程序没有被调用(gdb 没有命中断点并且 coutS 没有效果)。如果我杀死程序 telnet 会说连接已关闭。所以似乎连接已经建立,但为什么处理程序没有被调用?
编辑:
奇怪的是,如果在 start() 中我将 ioservice.run() 放在 startAccept()之后,它会起作用。现在我想知道为什么这行得通......事实上后来我再次调用 start accept 并且它仍然有效,并且它是在 ioservice.run() 调用之后......
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 一次。除非调用了写请求,否则我需要再次读取......看起来......好吧,我至少现在可以工作了。
c++ - Asio 异步和并发
我正在boost::asio
使用异步 TCP 连接编写一些代码。我不得不承认我对此有些怀疑。所有这些都与并发有关。这里有一些:
如果我
async_write
在同一个套接字上启动两个或多个而不等待第一个完成会发生什么?处理程序(和async_write
)会重叠还是asio
提供序列化和同步?async_connect
与和相同的问题async_read
。一般来说,从不同的线程调用这些函数是否安全(我不是在谈论使用不同的缓冲区,这是另一个问题......)。
c++ - 更好的提升 asio 截止时间_定时器示例
我正在寻找一个更好的例子boost::asio::deadline_timer
给出的示例总是会超时并调用该close
方法。我尝试调用cancel()
一个计时器,但这会导致传入的函数async_wait
立即被调用。
在异步 tcp 客户端中使用计时器的正确方法是什么?
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
作为构造参数的子类。
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()
功能对我来说几乎是个谜。
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++ 库都应该没问题。谢谢!
c++ - 一般提升 asio 流读取问题
我对在 asio 中如何将数据读入流中的工作方式感到有些困惑。我的主要问题是:
- 如果一台计算机同时进行多个异步写入,而接收计算机上只有一个异步读取,会发生什么情况。通过 TCP 协议,数据是否有可能交错?
- ASIO 库如何知道何时调用处理读取流中的新数据的处理程序?它会调用每个接收到的字节吗?当客户端断开连接?
- 有没有使用流的好(和简单)示例,而不是使用 asio 从 tcp 套接字读取的缓冲区?
谢谢。
c++ - boost::asio 完全断开连接
有时 boost::asio 似乎在我想要它之前断开连接,即在服务器正确处理断开连接之前。我不确定这是怎么可能的,因为客户端似乎认为它完全发送了消息,但是当服务器发出错误时,它甚至没有读取消息头......在测试期间,这可能只发生五分之一,服务器收到客户端关闭消息,并干净地断开客户端。
错误:“现有连接被远程主机强行关闭”
客户端断开连接:
服务器:
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 是什么。我关注了文档中的一些链接,发现它是“实现定义的”,但我想我可能是错的。所以我的两个具体问题是:
- 如何使用这两个迭代器来读取无符号整数?
- 这些迭代器指向什么类型?
谢谢!