ipc:// 上的 ZeroMQ REQ/REP 和并发性

2024-01-08

我使用 REQ/REP 0MQ ipc:// 套接字实现了一个 JSON-RPC 服务器,我遇到了奇怪的行为,我怀疑这是由于 ipc:// 底层 unix 套接字不是真正的套接字,而是一个事实一根管子。

根据文档,必须强制执行严格的 zmq_send()/zmq_recv() 交替,否则无序的 zmq_send() 将返回错误。

但是,我希望强制执行是针对每个客户端的,而不是针对每个套接字的。当然,对于 Unix 套接字,从多个客户端到服务器只有一条管道,因此服务器不会知道它正在与谁通信。两个客户端可以同时 zmq_send(),服务器会将其视为交替违规。

顺序可以是:

  • 客户端A:zmq_send()
  • ClientB: zmq_send() :它会阻塞直到 其他发送/接收完成吗?它会返回-1吗? (我怀疑它会 使用 ipc:// 由于固有的低级问题,但使用 TCP 则可以 区分两个客户)
  • 客户端A:zmq_recv()
  • 客户端B:zmq_recv()

那么 tcp:// 套接字呢?会同时进行吗?我应该使用其他锁定机制来解决这个问题吗?

服务器示例:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

#include <czmq.h>


int main(void) 
{
    zctx_t *zctx   ;
    void *zsocket_rpc;

        printf ("rpcserver create context\n");
    zctx = zctx_new();
        printf ("rpcserver create socket\n");
    zsocket_rpc = zsocket_new (zctx, ZMQ_REP);
        if (!zsocket_rpc) {
                fprintf (stderr, "zsocket_rpc is NULL\n");

                exit(1);
        }
    zsocket_bind (zsocket_rpc, "ipc:///tmp/rpcserver");

        for(;;) {
                int rc;

                char *msg = zstr_recv(zsocket_rpc);
                printf ("rpcserver received %s\n", msg);

                printf ("rpcserver sleep\n");
                usleep(200000);

                printf ("rpcserver send %s\n", msg);
                rc = zstr_send(zsocket_rpc, msg);
                if (rc < 0) {
                        fprintf (stderr, "rpcserver zstr_send returned %d\n", rc);
                        continue;
                }
                free(msg);
        }

}

示例客户端(作为 ./rpcclient letter 启动):

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <czmq.h>

int main(int argc, char *argv[]) 
{
        char msg[] = "A:MESSAGE 999";
    zctx_t *zctx;
    void *zsocket_rpc;

        if (argc != 2) {
                fprintf (stderr, "Usage: rpcclient letter\n");
                exit(1);
        }

    zctx = zctx_new();
        printf ("rpcclient new socket\n");
    zsocket_rpc = zsocket_new (zctx, ZMQ_REQ);
        if (!zsocket_rpc) {
                fprintf (stderr, "zsocket_rpc is NULL\n");

                exit(1);
        }
        printf ("rpcclient connect\n");
    zsocket_connect (zsocket_rpc, "ipc:///tmp/rpcserver");

        for (int cnt = 0; cnt < 1000; cnt++) {
                int rc;

                sprintf (msg, "%c:MESSAGE %03d", argv[1][0], cnt);
                printf  ("rpcclient send %s\n", msg);
                rc = zstr_send(zsocket_rpc, msg);
                if (rc < 0) {
                        fprintf (stderr, "rpcclient zstr_send returned %d\n", rc);
                        continue;
                }
                printf ("rpcclient sleep...\n");
                usleep(200000);

                char *reply = zstr_recv(zsocket_rpc);
                printf  ("rpcclient recv %s\n", reply);

                free(reply);
        }

}

您必须解释哪些事件顺序无法实现您想要的效果。这样就不清楚你的问题是关于什么的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ipc:// 上的 ZeroMQ REQ/REP 和并发性 的相关文章

  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 在键盘热插拔上加载模块

    我正在尝试学习如何为 Linux 系统编写模块和驱动程序 类似于this https unix stackexchange com questions 120839 usb kernel module does not load on de
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • ZeroMQ 在 python 多处理类/对象解决方案中挂起

    我正在尝试将 Python pyzmq 中的 ZeroMQ 与多处理一起使用 作为一个最小的 不是 工作示例 我有一个服务器类和一个客户端类 它们都继承自multiprocessing Process 客户端作为子进程应向服务器子进程发送消
  • 如何拆分一行并重新排列其元素?

    我在一行中有一些数据 如下所示 abc edf xyz rfg yeg udh 我想呈现如下数据 abc xyz yeg edf rfg udh 以便打印备用字段并用换行符分隔 有没有这样的衬里 下列awk脚本可以做到这一点 gt echo
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • Linux 中 AF_UNIX 数据报消息的最大大小是多少?

    目前我已达到 130688 字节的硬限制 如果我尝试在一条消息中发送更大的内容 我会收到一条消息ENOBUFS error 我已经检查过net core rmem default net core wmem default net core
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • meld - GLib-GIO-ERROR**:系统上未安装 GSettings 架构

    经过近40个小时的努力 我终于安装了meld 3 14 2 在Redhat 6 3服务器的NFS共享上 安装了每个依赖项 最后似乎成功了 但最后一个错误需要解决 meld 20703 GLib GIO ERROR No GSettings
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插

随机推荐

  • MPI_Comm_spawn 和 MPI_Reduce

    我有两个程序 主人 产生 工作人员 执行一些计算 我希望主人从工作人员那里获取结果并存储总和 我正在尝试使用 MPI Reduce 从工作人员收集结果 工作人员使用 MPI Reduce 将结果发送给主机 MPI Comm 我不确定这是否正
  • 蓝牙无法在后台模式下扫描附近的设备 Android 11+

    我尝试在后台模式下扫描附近的蓝牙设备 但它在 Android 11 等某些设备上不起作用 这是我的示例代码 在前台工作得很好 授予所有权限
  • chrome mobile和safari mobile中的陀螺仪值不同

    我目前正在构建一个小型全景照片查看器 它可以选择使用陀螺仪导航场景 我从 deviceOrientation 事件中获取数据 并将欧拉角转换为旋转矩阵 然后对其进行一些变换 最终通过 3dMatrix 变换移动 css 立方体 我的问题是
  • Bootstrap 材料设计 CDN

    我想使用 Bootstrap Material design github 页面说我可以从jsdelivr com http www jsdelivr com bootstrap material design 但随后入门 https fe
  • 可滚动元素的顶部被隐藏[重复]

    这个问题在这里已经有答案了 我正在开发一个项目 其中包括一个带有可滚动单元格的表格 这看起来可能不是使用表格的最优雅的方式 但这正是我的用例的方法 不幸的是 我的单元格内容的顶部仍然隐藏 我无法滚动到它 这是该项目的一个非常小的样本 一个大
  • 如何将相同的元素添加到javascript数组n次

    var fruits fruits push lemon lemon lemon lemon 与其推送相同的元素 不如这样编写一次 fruits push lemon 4 times 对于基元 使用 fill var fruits new
  • 创建 MSBuild 自定义任务以在*编译之前*修改 C# 代码

    我想创建一个自定义 MSBuild 任务 在 csc exe 编译我的 cs 文件之前更改它们 但是 当然 这不会就地修改它们 我不希望触及实际的源文件 我知道 PostSharp 和其他 NET AOP 框架 但它们不是这个特定项目的选择
  • 将逗号分隔的浮点数字符串转换为列表?

    我需要定义一个函数txtnum L 需要一串逗号分隔的浮点数 例如 1 5 2 5 3 5 作为参数并将其转换为列表 1 5 2 5 3 5 我尝试过使用 split join map 等 并且无法获取任何内容来返回不包含引号的列表 我对
  • 如何将 GPS 观察器移至 App.xaml 超类并将事件调度至其他页面/类?

    我是 silverlight WPF 和 WP7 开发新手 但我熟悉使用控制台或 Windows 窗体开发 C 所以请耐心等待 我正在尝试使用 Silverlight SDK 和 Microsoft Maps MapControl 以及 S
  • 如何将 recyclerView 中的前 4 项设置为可见性消失?

    实际上 我有一个菜单 可以在 recyclerView 中添加 MainActivity 按钮 在该菜单中我显示所有添加的按钮 以便可以删除所选按钮 但是我有 4 个该 recyclerView 的第一个项目应该是默认的 所以没有人应该触摸
  • DataGridView右键菜单/复制示例?

    我的表单上有一个 DataGridView dgv1 在特定的单元格中 我希望用户能够右键单击并选择 复制 以将单元格的内容复制到剪贴板 任何人都可以向我指出一个教程或网站的方向 展示如何在 C 中完成此任务吗 Thanks 您可以使用 C
  • bookdown 中的代码折叠

    RMarkdown 中用于 html 文档的代码折叠选项非常棒 该选项使编程方法对于感兴趣的人来说是透明的 而无需强迫观众滚动浏览数英里的代码 代码与散文和交互式图形输出的紧密放置使得整个项目更容易被更广泛的受众所理解 此外 它还减少了对额
  • 优化构造函数调用次数

    在工作中 我们有一个带有昂贵构造函数的类 因此我们希望调用它的次数尽可能少 我们研究了它的用途 并尝试使代码对 RVO 更加友好 然而 我们在 g 编译器中发现了一个怪癖 我们不明白发生了什么 请考虑operator 的两种实现 const
  • 单元测试静态类

    设想 语言C 使用VS2008单元测试框架进行单元测试 我有一个带有静态构造函数和 2 个方法的静态类 我编写了 4 个测试方法来测试整个班级 我的静态构造函数有一些重要的初始化 现在 如果我同时运行所有 4 个单元测试用例 静态构造函数将
  • 约束布局中的背景图像不起作用

    我希望我的应用程序在后台使用图像来进行注册和登录功能 我正在使用 android studio 2 3 到目前为止我可以看到自去年以来很多事情都发生了变化 我们现在使用相对或线性布局的地方就是约束布局 我包含了根布局的代码如下 androi
  • 由于 java.lang.IllegalArgumentException,应用程序在启动时崩溃:列“_id”不存在

    每当我启动我的应用程序时 我都会得到一个java lang IllegalArgumentException column id does not exist我的 LogCat 中出现错误 我已经创建了专栏 id 但它仍然抛出这个 这是我的
  • 零或一到零或一的关系

    有没有办法创建一个0 or 1 to 0 or 1数据库中的关系 例如 假设我有一张经理表和一张艺术家表 经纪人只能管理一名艺人 艺人也只能拥有一名经纪人 然而 经理人可以没有艺人 即寻找艺人来管理 而艺人也可能没有经理人 有什么办法可以做
  • 如何在 Facelets 的 EL 布尔表达式中使用 && ?

    我在弄清楚如何在 Facelets 中的 EL 表达式上执行和操作时遇到了一些麻烦 所以基本上我有
  • 如何在 asp.net MVC 中生成下载文件的链接?

    我正在测试轻而易举报告 http www codeplex com doddlereport从 IEnumerable 对象生成一些报告 我需要生成这样的链接 PDF http myserver com reports ProductsRe
  • ipc:// 上的 ZeroMQ REQ/REP 和并发性

    我使用 REQ REP 0MQ ipc 套接字实现了一个 JSON RPC 服务器 我遇到了奇怪的行为 我怀疑这是由于 ipc 底层 unix 套接字不是真正的套接字 而是一个事实一根管子 根据文档 必须强制执行严格的 zmq send z