我有一个使用boost\asio创建的简单UDP服务器,目前仅打印接收到的数据,如下所示。
using boost::asio::ip::udp;
enum { max_length = 2048 };
void server(boost::asio::io_context& io_context, unsigned short port)
{
std::cout << "Server Created on port " + std::to_string(port) << " \n" << std::flush;
udp::socket sock(io_context, udp::endpoint(udp::v4(), port));
while(true)
{
udp::endpoint sender_endpoint;
std::vector<char> v(max_length);
sock.receive_from(boost::asio::buffer(v), sender_endpoint);
for (int i = 0; i < v.size(); i++)
{
std::cout << v[i] <<std::flush;
}
std::cout << std::endl;
}
}
我使用分配给
server的
boost::thread创建
thread_group函数的3个线程:
boost::asio::io_context io_context;
boost::thread_group tg;
boost::thread *t = new boost::thread(server, std::ref(io_context), 8889);
boost::thread *t1 = new boost::thread(server, std::ref(io_context), 8890);
boost::thread *t2 = new boost::thread(server, std::ref(io_context), 11111);
tg.add_thread(t);
tg.add_thread(t1);
tg.add_thread(t2);
tg.join_all();
为了测试服务器,我使用了 Packet Sender。问题是输出被...打乱了。
每秒一次(或多或少)在3个端口上一次发送数据包时,输出会稍微错位,但将数据包频率 boost 到每0.1秒一次时,输出将变得不可读,如 these two images所示。我尝试为每个服务器提供一个单独的
io_context对象,但是在高频下输出保持不变。有什么办法可以避免这种情况?
请您参考如下方法:
std::cout自动为您进行一些锁定,一次打印操作不会与来自不同线程的另一次打印重叠。但是,当您一次打印一个字符时,每个线程的输出可能会重叠。在每个已打印字符之后进行冲洗也可能导致性能下降。
如果将要打印的内容构建为单个字符串,则应正确打印:
std::vector<char> v(max_length);
size_t bytes = sock.receive_from(boost::asio::buffer(v), sender_endpoint);
std::string str(v.data(), bytes);
str += '\n';
std::cout << str;
或者,您可以跳过 vector 并直接保存为字符串:
std:: string str(max_length);
size_t bytes = sock.receive_from(boost::asio::buffer(str), sender_endpoint);
str.resize(bytes)
str += '\n';
std::cout << str;




