我正在努力了解boost::asio
库的内部工作,这非常棒。我写了一个简单的客户端,它将一条消息发送到服务器。
问题是 - 它在哪个线程中真正发送了消息?
由于我使用async_write()
方法,它在调用后立即返回,并且不发送任何内容。我已经评论了io_service.run()
方法,之后没有调用处理程序(没关系),但是消息已经发送了! (我在服务器日志中检查了它)
顺便说一句,我在编译时不使用-lpthread
,只使用-lboost_system
,所以我假设整个程序在一个线程中工作,并且没有“隐藏”线程。
我不能发出消息发送到何处的头部或尾部。
#include <iostream>
#include <boost/asio.hpp>
const std::string str("HELLO!");
int main()
{
boost::asio::io_service io_service;
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 33333);
boost::asio::ip::tcp::socket socket(io_service);
boost::system::error_code ec;
boost::asio::connect(socket, &endpoint, ec);
boost::asio::async_write(socket, boost::asio::buffer(str),
[](const boost::system::error_code& ec, std::size_t length)
{
if (!ec)
{
std::cout << "Sent!" << std::endl;
}
else
{
std::cout << "Err: " << ec.message() << std::endl;
}
});
//io_service.run();
return 0;
}
答案 0 :(得分:2)
在调用{期间}消息将被发送(或者至少在网络堆栈中排队,可能由内核线程处理,或者您不需要关心的其他一些与实现相关的机制) {1}}。没有必要推迟,如果可以在不阻塞调用线程的情况下完成,通常可以这样做。
在async_write
运行之前,不会调用完成处理程序,并通知消息已发送。