消息队列和 socket 速度

需求 选择消息队列或者 socket 来传递信息,速度哪个快? 解决 长连接时, socket 比 queue 慢 10% 短连接时,速度更慢。 建议: 长连接,使用 socket,毕竟方便,效率也没有低太多。 短连接,使用 queue,或者数据库连接池。 参考 【本文已迁移到“程序员文摘” http://programmerdigest.cn/category/lajp】Linux下消息队列和socket绝对速度比拼 【转】Linux下消息队列和socket绝对速度比拼 数据库连接池学习笔记(一):原理介绍+常用连接池介绍 用消息队列和socket实现聊天系统

<span title='2023-06-29 18:06:00 +0800 CST'>2023-06-29</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;23 words&nbsp;·&nbsp;RamLife

多进程通信几种方式介绍

需求 多进程通信有哪几种方式? 解决 管道 命名管道 FIFO 使用 mkfifo 来创建管道文件。 不相关进程也可以通信。 匿名管道 使用 fork 来创建。只能用于父子进程。 消息队列 queue 保存在内核中的消息列表,如果没有释放,会一直存在。缺点时,不适合大数据的传输,单个消息有长度限制,全部消息总长度也有限制。 共享内存 同一块内存,多个进程都可以读写,可以省去复制的时间。但是如何管理多个进程的读写是个问题。 信号量 信号量可以用来管理共享内存,只有拿到信号量的才能进行读写。 信号 异常工作下的情况,就需要使用信号来进行干预了。比如说 ctrl-c 发出的 SIGINT 用来终止进程。 socket 可以用来本机之间不同进程的通信,也可以用作网络上不同主机之间的通信。 参考 {整理} Linux 进程间通信的方式、应用场景及优缺点 Linux进程间通信(IPC)的六种方式 一文搞懂六大进程通信机制原理(全网最详细) Linux进程间通信详解(最全)

<span title='2023-06-28 18:06:00 +0800 CST'>2023-06-28</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;36 words&nbsp;·&nbsp;RamLife

localhost, 127.0.0.1, ip 区别

需求 和本级进程通信的时候,使用 localhost, 127.0.0.1, 本级 ip 之间的区别? 解决 localhost 连 IP 都没有,不会有IP报头,只会有 TCP 报头。从上向下,经过 应用层,传输层。 127.0.0.1 有 IP,会有 IP 报头。 从上向下,经过 应用层,传输层,网络层。 参考 【IP/TCP】127.0.0.1和localhost和本机IP三者的区别

<span title='2023-06-27 18:06:00 +0800 CST'>2023-06-27</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;24 words&nbsp;·&nbsp;RamLife

c++ json 库 nlohmann json 转换异常 [json.exception.type_error.305]

需求 nlohmman 进行 json 转换时,报异常: [json.exception.type_error.305] cannot use operator[] with a string argument with array. 解决 转换为 json 异常 原因可能是,嵌套时,括号不匹配 void to_json(json& j, const VoltageConfigJson& config) { j = json{{"config_name", config.name}}; for (auto & cfg : config.data) { json channel; to_json(channel, cfg); j["config_data"].push_back(channel); } } 上面这个代码中,如果第一句写成下面这样,那么就会是 305 的异常。 j = json{"config_name", config.name}; 参考 {json.exception.type_error.305} cannot use operator{} with a string argument with array Cannot use operator{} with a string argument with string...

<span title='2023-06-26 18:45:00 +0800 CST'>2023-06-26</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;92 words&nbsp;·&nbsp;RamLife

c++ json 库 nlohmann 中类和 json 转换

需求 尝试使用 nlohmman 把复杂的类转为 json。 解决 复杂的类需要对其中的某些部分单独抽出来进行转换。 用于转换为 json 的类 struct VoltageSetConfigData { float w1; float p1; float w2; float p2; float ref; float pf; }; using VoltageGetConfigData = VoltageSetConfigData; class VoltageConfigJson { public: std::string name; std::vector<VoltageGetConfigData> data; }; 数组单个元素转换 void to_json(json& j, const VoltageGetConfigData& data) { j = json{{"w1", data.w1}, {"p1", data.p1}, {"w2", data.w2}, {"p2", data.p2}, {"ref", data.ref}, {"pf", data.pf}}; } void from_json(const json& j, VoltageGetConfigData& data) { j.at("w1").get_to(data.w1); j....

<span title='2023-06-26 18:45:00 +0800 CST'>2023-06-26</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;135 words&nbsp;·&nbsp;RamLife

c++ json 库 nlohmann 文件读写

需求 nlohmman 读写 json 配置文件. 解决 写文件 QString fileName = QFileDialog::getSaveFileName(this, tr("save config file"), "./voltage_", tr("Json (*.json)")); qDebug() << fileName << Qt::endl; if (fileName.isEmpty()) return; ofstream file(fileName.toStdString(), ios::out); json j; to_json(j, config_json); file << j << std::endl; 读文件 QString file_name = QFileDialog::getOpenFileName(this, tr("load config file"), "./voltage_", tr("Json (*.json)")); qDebug() << file_name << Qt::endl; if (file_name.isEmpty()) return; ifstream file(file_name.toStdString(), ios::in); json j = json::parse(file); 参考 nlohmann/json 的主要用法 【C++ JSON 开源库】nlohmann入门使用总结 nlohmann/json...

<span title='2023-06-26 18:45:00 +0800 CST'>2023-06-26</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;72 words&nbsp;·&nbsp;RamLife

QT 线程池 介绍

需求 最近想了解下 线程池。 解决 QT 多线程之线程池QThreadPool(深入理解) 参考

<span title='2023-06-26 10:02:00 +0800 CST'>2023-06-26</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;7 words&nbsp;·&nbsp;RamLife

QT tcp server 多线程

需求 qt 在 tcp 编程时,希望 server 多线程来处理多个客户端的连接。 解决 多线程来处理连接的时候,还是 override incomingConnection 比较方便。主要是两个方面的工作: 创建新的 TcpSocket 方便处理数据 每个线程用来维护多个客户端 参考 QT的TCP连接多线程实现 QT编写TCP/UDP调试助手之多线程TCP服务器 Qt多线程 TCP 服务端 QT学习:QTcpServer多线程实现 QTcpServer多线程实现 iap_download QT编写TCP/UDP调试助手之多线程TCP服务器

<span title='2023-06-26 07:55:00 +0800 CST'>2023-06-26</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;26 words&nbsp;·&nbsp;RamLife

QT tcp server 多连接

需求 qt 在 tcp 编程时,希望 server 是多连接的,可以同时连接多个 client 解决 服务器接到新客户端连接后,会分配一个 SocketDescriptor, 然后 emit newConnection(), 服务器收到新信息,会 emit readRead(). 但是上面这两个信号都不会传递 SocketDescriptor, 所以无法分辨客户端。 override incomingConnection 重写 incomingConnection 可以获取 socketDescriptor, 然后继承 QTcpSocket 新建一个 tcp 的类,来获取 socketDescriptor. 虽然比较麻烦,但是后面多线程处理会比较方便。 nextPendingConnection nextPendingConnection 可以获取新连接的客户端,但是也是得不到 SocketDescriptor, 不过可以通过 QTcpSocket 的 peerAddress() 和 peerPort() 来获取客户端的 ip 和 端口,可以作为分辨客户端的依据。 readyRead 也可以使用 QTcpSocket::readyRead 这个信号来绑定 lambda 接收并回复的表达式。 参考 QT TCP网络编程 QT 之TCP网络编程(非常值得看的一篇博客!) QT TCP服务端如何判断客户端已断开连接 qt之QAbstractSocket incomingConnection qtcpsocket 【QT实现TCP数据发送和接收】

<span title='2023-06-25 07:55:00 +0800 CST'>2023-06-25</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;64 words&nbsp;·&nbsp;RamLife

QT QDataStream function commitTransaction return false

需求 最近在做一个 tcp demo 的时候,发现直接 read 没有问题,但是当使用 QDataStream 的 commitTransaction 来读取,返回的就是 false 这个就比较奇怪。 解决 通过 wireshark 抓包,发现 server 数据是已经发出来了,只是 client 解析错误。重新检查发送部分的代码,经过调整后,发现,向 QDataStream 里面写数据的时候,只能写 QString, 如果直接写字符串,就会读取错误。直接对比两种情况的打印,也发现,确实两种情况下,保存到 QByteArray 中的数据是不一样的。 参考 Question about QDataStream and its functions startTransaction and commitTransaction QIODevice 类 - 什么是设备? 什么是序列化? Serializing Qt Data Types QDataStream 类 - 序列化工具

<span title='2023-06-24 07:55:00 +0800 CST'>2023-06-24</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;50 words&nbsp;·&nbsp;RamLife