C++编程:使用Nanomsg实现高效的文件和图片传输

0. 概要

Nanomsg是个不错的高性能通信中间件,但是在传输文件和图片的时候性能不足,本文将介绍如何优化Nanomsg配置以用于文件和图片的传输。

本文详细代码:sub_pub_nanomsg_shm
更低延时的方法请看 C++高性能编程:使用 Nanomsg 实现基于共享内存的发布-订阅模型

1. 实现细节

1.1 公共文件:pub_sub_common.h

这个文件包含了常量定义和基本函数,用于实现发布-订阅通信。

#ifndef PUB_SUB_COMMON_H
#define PUB_SUB_COMMON_H

#include <nanomsg/nn.h>
#include <nanomsg/pubsub.h>

constexpr const char* URL = "ipc:///tmp/pub_sub_nanomsg.ipc";
constexpr int NUM_MESSAGES = 10000;
constexpr int POLL_TIMEOUT = 10;
constexpr int BUFFER_SIZE = 16 * 1024 * 1024;
constexpr int RECVMAXSIZE = 128 * 1024 * 1024;

#endif  // PUB_SUB_COMMON_H

1.2 发布者代码:pub_nanomsg.cc

发布者代码负责创建一个发布者socket,将文件或图片数据块发送给订阅者,并确保在订阅者准备好之前不发送消息。

#include "pub_sub_common.h"

bool is_subscriber_ready() {
  return true;  // 简化实现,假设订阅者总是准备好了
}

void publisher(const std::vector<uint8_t>& data) {
  int sock = nn_socket(AF_SP, NN_PUB);
  nn_bind(sock, URL);

  for (int i = 0; i < NUM_MESSAGES; ++i) {
    nn_send(sock, data.data(), data.size(), 0);
  }

  nn_close(sock);
}

int main() {
  std::vector<uint8_t> data(5 * 1024 * 1024, 0);  // Example data block of 5 MB
  std::generate(data.begin(), data.end(), rand);
  publisher(data);
  return 0;
}

1.3 订阅者代码:sub_nanomsg.cc

订阅者代码负责接收发布者发送的数据块。

#include "pub_sub_common.h"

void subscriber() {
  int sock = nn_socket(AF_SP, NN_SUB);
  nn_connect(sock, URL);
  nn_setsockopt(sock, NN_SUB, NN_SUB_SUBSCRIBE, "", 0);
  nn_setsockopt(sock, NN_SOL_SOCKET, NN_RCVBUF, &BUFFER_SIZE, sizeof(BUFFER_SIZE));
  nn_setsockopt(sock, NN_SOL_SOCKET, NN_RCVTIMEO, &RECEIVE_TIMEOUT, sizeof(RECEIVE_TIMEOUT));
  nn_setsockopt(sock, NN_SOL_SOCKET, NN_RCVMAXSIZE, &RECVMAXSIZE, sizeof(RECVMAXSIZE));

  char* buf = nullptr;
  for (int i = 0; i < NUM_MESSAGES; ++i) {
    nn_recv(sock, &buf, NN_MSG, 0);
    nn_freemsg(buf);
  }

  nn_close(sock);
}

int main() {
  subscriber();
  return 0;
}

2. 流程图

2.1 发布者流程图

No
Yes
Start
Initialize Publisher Socket
Bind to URL
Is Subscriber Ready?
Wait
Create Data Block
Send Data Block
Repeat for NUM_MESSAGES
Close Socket
End

2.2 订阅者流程图

Received
Start
Initialize Subscriber Socket
Connect to URL
Subscribe to All Messages
Set Buffer Sizes and Timeouts
Receive Messages
Process Data
Close Socket
End

3. 测试结果

3.1 发布端

test@t:~/sub_pub_nanomsg_shm/build$ ./pub_nanomsg
### Default NN_SNDBUF size 131072.
### After set NN_SNDBUF size 16777216.
Publisher socket bound to ipc:///tmp/pub_sub_nanomsg.ipc
@@ Start to send, current time: 2024-08-06 13:56:10.115
@@ Finish send, current time: 2024-08-06 13:56:41.016
Publisher finish send 10000 messages

3.2 订阅端

test@t:~/sub_pub_nanomsg_shm/build$ ./sub_nanomsg
### Default NN_RECVBUF size 131072.
### After set NN_RECVBUF size 16777216.
Subscriber socket connected to ipc:///tmp/pub_sub_nanomsg.ipc
@@ Start to recv, current time: 2024-08-06 13:56:10.044
@@ Finish recv, current time: 2024-08-06 13:56:41.014
Subscriber receive 10000 messages.
Average latency: 3.096960 milliseconds

4. 结果和分析

通过上述测试结果,我们可以看到在发布端和订阅端之间传输了10000条消息,整个传输过程的平均延迟约为3.1毫秒。这表明,Nanomsg在处理高频率、大数据量传输时具有出色的性能和可靠性。

4.1 优势分析

  1. 高效传输: Nanomsg采用的零拷贝机制极大地提升了传输效率,特别适用于大文件和图片的传输。
  2. 简化编程模型: 使用发布-订阅模式简化了消息传递的复杂性,发布者和订阅者之间的解耦使得系统更易于扩展和维护。
  3. 高可扩展性: Nanomsg支持多种传输协议和模式,能够灵活适应不同的应用场景。
  4. 优化配置: 通过调整发送和接收缓冲区大小,可以进一步优化传输性能。

4.2 Nanomsg定制优化

  1. 缓冲区调整: 在测试中,我们将发送和接收缓冲区的大小从默认的131072字节增加到16777216字节,以适应大数据块的高效传输。
  2. 消息延迟: 使用Nanomsg的nn_poll机制实现非阻塞接收,有效降低了消息延迟,提高了系统的响应速度。

通过对Nanomsg进行适当的配置和优化,可以显著提升系统在高频率、大数据量传输中的性能表现。

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值