大佬教程收集整理的这篇文章主要介绍了c – 使用Boost Asio的快速数据(图像)传输服务器客户端,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我们希望开发一种尽可能简单的工具,在客户端和服务器之间尽可能快地连续发送图像数据.基本上它是流媒体.我们更愿意使用TCP,但如果我们可以通过UDP获得显着的性能提升,我们不介意偶尔丢失数据包.
数据是无符号字符缓冲区(640x480px = 307200字节= 2.34R_857_11845@Bit,单色).
我从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 client int 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 images for(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; }
以上是大佬教程为你收集整理的c – 使用Boost Asio的快速数据(图像)传输服务器客户端全部内容,希望文章能够帮你解决c – 使用Boost Asio的快速数据(图像)传输服务器客户端所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。