c – 使用Boost Asio的快速数据(图像)传输服务器客户端

c – 使用Boost Asio的快速数据(图像)传输服务器客户端,第1张

概述我对网络编程比较陌生,对使用Boost Asio在客户端和服务器之间进行连续快速数据(图像)传输的最佳实践有一些疑问.重要的是,我们不能应用降低图像质量的压缩.我们使用专用网络(54MBit),除了我们的网络之外没有其他流量.我们被推荐使用Boost Asio,因为它似乎适合我们的需求.然而,由于Boost功能强大,对像我这样缺乏经验的(Boost)开发人员来说是一项挑战. 我们希望开发一种尽可能 我对网络编程比较陌生,对使用Boost Asio在客户端和服务器之间进行连续快速数据(图像)传输的最佳实践有一些疑问.重要的是,我们不能应用降低图像质量的压缩.我们使用专用网络(54MBit),除了我们的网络之外没有其他流量.我们被推荐使用Boost Asio,因为它似乎适合我们的需求.然而,由于Boost功能强大,对像我这样缺乏经验的(Boost)开发人员来说是一项挑战.

我们希望开发一种尽可能简单的工具,在客户端和服务器之间尽可能快地连续发送图像数据.基本上它是流媒体.我们更愿意使用TCP,但如果我们可以通过UDP获得显着的性能提升,我们不介意偶尔丢失数据包.

数据是无符号字符缓冲区(640x480px = 307200字节= 2.34MBit,单色).

我从Asio教程开始,使用同步,异步,UDP,TCP项目.现在,我能够以~10fps发送数据,每个图像使用TCP约0.1ms,使用UDP约13fps.这太慢了.我希望在54MBit网络中发送2.4MBit更快.

今天,我不使用我的数据的序列化,存档和压缩(zip)等.我认为这会改善转会,但我想知道我是否必须满足我的期望和/或我是否必须完全改变我的方法?

将数据序列化作为与Asio进行数据流传输的方式吗?
zip压缩可能会显着改善转移吗?
有替代方法或框架吗?

TCP服务器代码示例

// sends data whenever it receives a request by the clIEntint main(int argc,char* argv[]){init_image_buffer();try{    boost::asio::io_service io_service;    tcp::acceptor acceptor(io_service,tcp::endpoint(tcp::v4(),13));    for (;;)    {        tcp::socket socket(io_service);        acceptor.accept(socket);        boost::system::error_code ignored_error;        boost::asio::write(socket,boost::asio::buffer(image_buffer),boost::asio::transfer_all(),ignored_error);    }}catch (std::exception& e){    std::cerr << e.what() << std::endl;}return 0;}

TCP客户端代码示例

我意识到这段代码不是最优的.但我无法弄清楚如何通过这种方法保持连接并请求新数据.

int main(int argc,char* argv[]){Clock clock;clock.Initialise();float avg = 0.0;float min = 1000000.0;float max = 0.0;float time = 0.0;// sending multiple imagesfor(int j=0;j<IMAGE_COUNT;j++){    try    {        clock.GetTime();        if (argc != 2)        {            std::cerr << "Usage: clIEnt <host>" << std::endl;            return 1;        }        boost::asio::io_service io_service;        tcp::resolver resolver(io_service);        tcp::resolver::query query(argv[1],13);        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);        tcp::resolver::iterator end;        tcp::socket socket(io_service);        boost::system::error_code error = boost::asio::error::host_not_found;        while (error && endpoint_iterator != end)        {            socket.close();            socket.connect(*endpoint_iterator++,error);        }        if (error)            throw boost::system::system_error(error);        // we read all received data but do NOT save them into a dedicated image buffer        for (;;)        {            boost::array<unsigned char,65536> temp_buffer;            boost::system::error_code error;            size_t len = socket.read_some(boost::asio::buffer(temp_buffer),error);            if (error == boost::asio::error::eof)                break; // Connection closed cleanly by peer.            else if (error)                throw boost::system::system_error(error); // Some other error.        }        time = clock.GetTime();    }    catch (std::exception& e)    {        std::cerr << e.what() << std::endl;    }    // calculate some time transfer statistics    avg+=time;    if(time < min) min = time;    if(time > max) max = time;}std::cout << "avg: " << avg/(float)IMAGE_COUNT << " freq: " << 1.0/(avg/(float)IMAGE_COUNT) << std::endl;std::cout << "min: " << min << " max: " << max << std::endl;return 0; }
解决方法@H_404_38@ 您似乎正在将帧大小(2.34MBit)与网络速度(54MBit / sec)进行比较.如果是这种情况,并且你得到10 fps,你的实际速率是23.4 MBit / sec – 这对于54 MBit / sec连接来说并不是那么糟糕.

无论如何,请告诉我们你最终的设计.

谢谢.

总结

以上是内存溢出为你收集整理的c – 使用Boost Asio的快速数据(图像)传输服务器客户端全部内容,希望文章能够帮你解决c – 使用Boost Asio的快速数据(图像)传输服务器客户端所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1230916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存