我是网络编程的新手,对使用Boost Asio在客户端和服务器之间连续快速进行数据(图像)传输的最佳做法有一些疑问。重要的是,我们不能应用会降低图像质量的压缩。我们使用专用网络(54MBit),除了我们的网络以外,没有其他流量。我们建议您使用Boost Asio,因为它似乎很适合我们的需求。但是,由于Boost功能强大,对于像我这样的经验不足(提升)的开发人员来说,这是一个挑战。
我们希望开发一种尽可能简单的工具,该工具可以在客户端和服务器之间尽可能快地连续发送图像数据。基本上是流媒体。我们宁愿使用TCP,但是如果我们可以通过UDP获得显着的性能提升,我们就不会介意偶尔丢失数据包。
数据是一个无符号的char缓冲区(640x480px = 307200字节= 2.34MBit,单色)。
我从Asio教程开始,然后处理sync,async,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;
}
最佳答案
看来您正在将帧大小(2.34MBit)与网络速度(54MBit/sec)进行比较。如果是这样,并且您获得10 fps,则您的实际速率为23.4 MBit/sec –对于54 MBit/sec的连接来说还不错。
无论如何,请告知我们您最终得到的设计。
谢谢。