当前位置: 首页 > news >正文

ubuntu下zmq编译安装及请求-应答模式测试

1.下载编译安装zmq

1.1 安装必须的库

sudo apt-get install libtool 
sudo apt-get install pkg-config 
sudo apt-get install build-essential
sudo apt-get install autoconf
sudo apt-get install automake

1.2 安装加密库

Sodium一个易于使用的可为我们提供加密、解密、签名,密码哈希等功能的软件库。除了自身强大的功能外,它还为我们提供了一个兼容API和一个外部API,以进一步的帮助我们提高其可用性。Sodium的目标 是提供构建更高级别加密工具具所需的所有核心操作

git clone git://github.com/jedisct1/libsodium.git
cd libsodium
./autogen.sh -s
./configure && make check
sudo make install
sudo ldconfig
cd ..

1.3 下载、编译、安装libzmq

# 下载
git clone https://github.com/zeromq/libzmq.git
cd libzmq
# 查看tag
git tag
# 版本 获取指定的版本,不要⽤主分⽀,可能有bug
git checkout v4.3.2
./autogen.sh
./configure && make check
sudo make install
sudo ldconfig
cd ..

sudo make install的是时候可以看到具体的.so和.a 
libtool: install: /usr/bin/install -c src/.libs/libzmq.lai /usr/local/lib/libzmq.la libtool: install: /usr/bin/install -c src/.libs/libzmq.a /usr/local/lib/libzmq.a libtool: install: chmod 644 /usr/local/lib/libzmq.a libtool: install: ranlib /usr/local/lib/libzmq.a libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig - n /usr/local/lib 
我们在编译的时候需要加上libzmq库,比如gcc -o bin file.c -lzmq 

2.测试 

让我们从简单的代码开始,一段传统的Hello World程序。我们会创建一个客户端和一个服务端,客户端发 送Hello给服务端,服务端返回World。下面是C语言编写的服务端,它在5555端口打开一个ZMQ套接字, 等待请求,收到后应答World。

client.c

#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
//编译:gcc -o hwclient hwclient.c -lzmq
int main (void)
{
    printf ("Connecting to hello world server...\n");
    void *context = zmq_ctx_new ();     // 一个线程
    //  连接至服务端的套接字
    void *requester = zmq_socket (context, ZMQ_REQ);    // 内部创建了2个线程,总共变成了3个线程
    zmq_connect (requester, "tcp://localhost:5555");    // 连接并绑定 绑定对应的io线程

    int request_nbr;
    for (request_nbr = 0; request_nbr != 10; request_nbr++) {
        char buffer [10];
        printf ("A 正在发送 Hello %d...\n", request_nbr);
        zmq_send (requester, "Hello", 5, 0);
        zmq_recv (requester, buffer, 5, 0);        // 收到响应才能再发
        //printf ("接收到 Hello World %d\n", request_nbr);
        printf ("B 正在发送 xiaoluo %d...\n", request_nbr);
        //zmq_send (requester, "Darren", 6, 0);   // 无效
        //zmq_send (requester, "king", 4, 0);      // 无效
        zmq_recv (requester, buffer, 6, 0);        // 收到响应才能再发
        printf ("接收到xiaoluo World %d\n", request_nbr);
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

 server.c

//
//  Hello World 服务端
//  绑定一个REP套接字至tcp://*:5555
//  从客户端接收Hello,并应答World
//

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
//gcc -o hwserver hwserver.c -lzmq
int main (void)
{
    //  Socket to talk to clients
    void *context = zmq_ctx_new ();
    //  与客户端通信的套接字
    void *responder = zmq_socket (context, ZMQ_REP);
    int rc = zmq_bind (responder, "tcp://*:5555");  // 服务器要做绑定
    assert (rc == 0);

    while (1) {
        //  等待客户端请求
        char buffer [10];
        int size = zmq_recv (responder, buffer, 10, 0);
        buffer[size] = '\0';
        printf ("收到 %s\n", buffer);
        sleep (1);          //  Do some 'work'
        //  返回应答
        zmq_send (responder, "World", 5, 0);
    }
    return 0;
}

client编译:gcc -o client client.c -lzmq

server编译:gcc -o server server.c -lzmq

注意:使用REQ-REP模式收发消息需要遵循一定的规律:客户端首先使用zmq_send发送消息,再使用zmq_recv接收消息,如果打乱了这个顺序,如连续接收或发送两次,则会报错。类似地。服务端必须先接收消息,后发送消息。

运行:启动顺序随意,先启动server或者client均可

相关文章:

  • c++输出:怎么解决数字过大时默认使用科学计数法输出的问题?
  • c++11实现一个自动注册的工厂模式
  • zmq发布-订阅模式c++实现
  • linux报错:bash: syntax error near unexpected token `(‘ --路径中有括号怎么处理?
  • golang学习总结--函数
  • golang学习总结--结构体、接口
  • 解决运行时报错:error while loading shared libraries xxx.so,cannot open shared object file
  • 超实用:linux shell光标移动常用快捷键
  • git commit之后如何撤销
  • golang学习总结--协程、channel
  • 跟我一起写dockerfile
  • dockerfile中多个FROM指令的意义(multistage)
  • dockerfile实战:使用dockerfile制作c/c++程序docker镜像
  • c++11并发编程一(std::thread之:thread构造函数)
  • c++11并发编程二(std::thread之:线程入口函数)
  • __proto__ 和 prototype的关系
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular 2 DI - IoC DI - 1
  • C++入门教程(10):for 语句
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Java 多线程编程之:notify 和 wait 用法
  • java正则表式的使用
  • PhantomJS 安装
  • React-生命周期杂记
  • uva 10370 Above Average
  • vue2.0项目引入element-ui
  • vue-cli在webpack的配置文件探究
  • vue的全局变量和全局拦截请求器
  • vue总结
  • 百度小程序遇到的问题
  • 大整数乘法-表格法
  • 浮动相关
  • 关于List、List?、ListObject的区别
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 正则与JS中的正则
  • (2)STM32单片机上位机
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (篇九)MySQL常用内置函数
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转) Android中ViewStub组件使用
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .equals()到底是什么意思?
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net Application的目录
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET程序员迈向卓越的必由之路
  • .NET业务框架的构建
  • .php文件都打不开,打不开php文件怎么办
  • @EnableAsync和@Async开始异步任务支持