![](/img/trans.png)
[英]Boost.Asio: The difference between async_read and async_receive
[英]boost.asio async_receive never resolve
我正在尝试通过实现回显服务器来学习asio的工作方式。 但是它从不回声!
这是我的代码( 请忽略资源泄漏 ):
#include<boost/asio.hpp>
#include<cstdio>
boost::asio::io_service ioService;
void echo(boost::asio::ip::tcp::socket* socket) {
char* buf = new char[1024];
socket->async_receive(boost::asio::buffer(buf, 1023), [buf, socket](auto ec, auto s) {
if (ec) {
std::printf("read failed: %s!\n", ec.message().data());
}
else
{
buf[s] = '\0';
std::printf("read:%s!\n", buf);
socket->async_send(boost::asio::buffer(buf, s), [socket](auto ec, auto s) {
if (ec) {
std::printf("write failed: %s!\n", ec.message().data());
}
else {
echo(socket);
}
});
}
});
}
void accept(boost::asio::ip::tcp::acceptor& acceptor) {
auto socket = new boost::asio::ip::tcp::socket{ ioService };
acceptor.async_accept(*socket, [socket](auto ec) {
if (ec) {
std::printf("accept failed:%s!\n", ec.message().data());
}
else {
std::printf("accept %s!", socket->remote_endpoint().address().to_string().data());
echo(socket);
}
});
}
int main() {
try {
boost::asio::ip::tcp::acceptor acceptor{ ioService, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8000) };
accept(acceptor);
while (true)
{
ioService.poll();
}
}
catch (std::exception&e) {
std::printf("error: %s\n", e.what());
}
}
我正在使用Java TCP客户端(已经使用Java TCP回显服务器测试过)来连接服务器并将消息发送到该服务器。 唯一起作用的是accept函数。 我可能在哪里弄错了?
问题是:
while (true)
{
ioService.poll();
}
您想要的是删除while循环并使用“运行”方法:
ioService.run();
实际的问题是,必须再次调用poll才能调用“ restart ”方法(或对于较旧版本的asio,使用较旧的reset方法,这在您的代码中是如此)。 循环的另一个问题是,当无事可做时,正在运行的CPU将处于100%状态,因为它处于硬循环中而无所事事...如果您使用“运行”方法,则CPU将使用无事可做时为0%。
例如
while (true)
{
ioService.poll();
ioService.reset();
}
引用ASIO文档:
当由于io_context停止或用尽而返回了这些函数的先前调用时,必须在对run(),run_one(),poll()或poll_one()函数进行任何第二次或更晚的调用集之前调用此函数工作。 调用restart()之后,io_context对象的stop()函数将返回false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.