【问题标题】:How to use Asio library to continuosly send large amount of byte over UDP (C++)如何使用 Asio 库通过 UDP (C++) 连续发送大量字节
【发布时间】:2020-05-10 11:07:46
【问题描述】:

我正在尝试使用独立 ASIO 库 (C++) 通过以太网使用 UDP 套接字发送图像(称为帧)。 我有一个每秒运行 30 次的无限循环,并且在每次迭代时,我想通过 UDP 发送帧。帧作为 c 样式的 char 数组 (char frame[]) 进行管理。

我读到 ASIO 支持异步操作,我正在尝试使用 async_send_to 方法在不阻塞调用者的情况下发送帧(为了不阻塞摄像头)。 由于每帧大约 4 MB,我必须发送 1500 字节的小数据包(UDP 允许的最大尺寸为 65537,但物理以太网限制为 1500 字节)。因此,在每次相机迭代中,我必须通过 UDP 发送超过 3000 个数据包。

我阅读了很多关于 ASIO 的文档,并提出了以下解决方案(高级伪代码):

    asio::io_context io_context;
    while(true){ // camera infinite loop
        auto frame = camera.getFrame(); // byte array

        for(i = 0; i < 3000; i++){
            char packet[1500]; 
            ...
            // fill the packet with (1500 - header) byte of the frame (header to reorder the packet
            ... 
            socket.async_send_to(packet); 
        }

        io_context.run(); // wait async operations to finish
        io_context.reset(); 
    }

我不确定这是否是一个有效的解决方案,以及我是否正确使用了 io_context.run() 函数。 我担心内部循环,它需要太多时间,我想知道是否有人知道我可以如何改进我的代码。

提前谢谢你

【问题讨论】:

    标签: c++ sockets udp asio


    【解决方案1】:

    io_context.run() 阻塞线程,直到所有异步处理程序都被调度,您可能希望在另一个线程中运行它,可能使用executor_work_guard 来防止它返回。

    但是,您的方法有缺陷。 UDP 不适合您的用例,因为它不可靠且不保证数据包顺序。即使所有发送的数据包都到达目的地,它们的接收者也可能使它们乱序。考虑为此使用 TCP。

    【讨论】:

    • 感谢线程建议。关于排序,我想我可以处理它为每个数据包添加一个标头。标头将包含一个索引,以在接收端正确构造帧。我的问题是如何有效地发送数据包。
    • 为什么不直接使用 tcp?
    • TCP 不是比 UDP 慢吗?
    • 视情况而定,有时会更快。此外,您将在 udp 之上添加一个层。 tcp 是显而易见的选择。
    猜你喜欢
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多