我有一个使用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; 
    } 
} 

我使用分配给 serverboost::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; 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!