小编Seb*_*ian的帖子

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

我是网络编程的新手,对于使用Boost Asio在客户端和服务器之间连续快速进行数据(图像)传输的最佳做法有一些疑问。重要的是,我们不能应用会降低图像质量的压缩。我们使用专用网络(54MBit),除了我们的网络以外,没有其他流量。我们建议您使用Boost Asio,因为它似乎很适合我们的需求。但是,由于Boost功能强大,对于像我这样的经验不足(提升)的开发人员来说,这是一个挑战。

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

数据是无符号字符缓冲区(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;
}
Run Code Online (Sandbox Code Playgroud)

TCP客户端代码示例

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

int main(int argc, char* argv[])
{
Clock clock;
clock.Initialise();

float avg = 0.0; …
Run Code Online (Sandbox Code Playgroud)

c++ streaming client-server boost-asio

5
推荐指数
1
解决办法
7595
查看次数

标签 统计

boost-asio ×1

c++ ×1

client-server ×1

streaming ×1