使用库版本
zeromq-4.0.3
接收端代码
#include <zmq.h>
#include "stdio.h"
int main(int argc, char * argv[])
{
void * pCtx = NULL;
void * pSock = NULL;
const char * pAddr = "tcp://*:7766";
//创建context,zmq的socket 需要在context上进行创建
if((pCtx = zmq_ctx_new()) == NULL)
{
return 0;
}
//创建zmq socket ,socket目前有6中属性 ,这里使用dealer方式具体使用方式请参考zmq官方文档
if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
{
zmq_ctx_destroy(pCtx);
return 0;
}
int iRcvTimeout = 5000;// millsecond
//设置zmq的接收超时时间为5秒
if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < 0)
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return 0;
}
//绑定地址 tcp://*:7766 也就是使用tcp协议进行通信,使用网络端口 7766
if(zmq_bind(pSock, pAddr) < 0)
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return 0;
}
printf("bind at : %s\n", pAddr);
while(1)
{
char szMsg[1024] = {0};
printf("waitting...\n");
errno = 0;
//循环等待接收到来的消息,当超过5秒没有接到消息时,zmq_recv函数返回错误信息
if(zmq_recv(pSock, szMsg, sizeof(szMsg), 0) < 0)
{
printf("error = %s\n", zmq_strerror(errno));
continue;
}
printf("received message : %s\n", szMsg);
}
return 0;
}
发送端代码
#include <zmq.h>
#include "stdio.h"
int main(int argc, char * argv[])
{
void * pCtx = NULL;
void * pSock = NULL;
//使用tcp协议进行通信,需要连接的目标机器IP地址为192.168.1.2通信使用的网络端口 为7766
const char * pAddr = "tcp://192.168.1.2:7766";
//创建context
if((pCtx = zmq_ctx_new()) == NULL)
{
return 0;
}
//创建socket
if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL)
{
zmq_ctx_destroy(pCtx);
return 0;
}
int iSndTimeout = 5000;// millsecond
//设置接收超时
if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iSndTimeout, sizeof(iSndTimeout)) < 0)
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return 0;
}
//连接目标IP192.168.1.2,端口7766
if(zmq_connect(pSock, pAddr) < 0)
{
zmq_close(pSock);
zmq_ctx_destroy(pCtx);
return 0;
}
//循环发送消息
while(1)
{
static int i = 0;
char szMsg[1024] = {0};
snprintf(szMsg, sizeof(szMsg), "hello world : %3d", i++);
printf("Enter to send...\n");
if(zmq_send(pSock, szMsg, sizeof(szMsg), 0) < 0)
{
fprintf(stderr, "send message faild\n");
continue;
}
printf("send message : [%s] succeed\n", szMsg);
getchar();
}
return 0;
}
编译
gcc -o recv recv.c -lzmq
gcc -o send send.c -lzmq
运行
export LD_LIBRARY_PATH=/usr/local/lib/
接收端
$ ./recv
bind at : tcp://*:7766
waitting...
received message : hello world : 0
waitting...
received message : hello world : 1
waitting...
received message : hello world : 2
waitting...
received message : hello world : 3
waitting...
received message : hello world : 4
waitting...
received message : hello world : 5
waitting...
发送端
$ ./send
Enter to send...
send message : [hello world : 0] succeed
Enter to send...
send message : [hello world : 1] succeed
Enter to send...
send message : [hello world : 2] succeed
Enter to send...
send message : [hello world : 3] succeed
Enter to send...
send message : [hello world : 4] succeed
Enter to send...
send message : [hello world : 5] succeed
UserInfo.proto,适⽤用于protobuf3的协议定义⽂文件,该协议包含两部分:
Part-1:Server/Client消息定义,⽤用于Client主动请求Server的协议内容;
Part-2:Publish/Subscribe消息定义,⽤用于Publisher主动发布数据给Subscriber的协议内容,其中每条消息对应的topic参考其注释;
syntax = "proto3";
package UserInfo.proto;
/* ----------Part-1 : Server/Client消息定义---------- */
/* 请求类型枚举 */
enum RequestType {
UNKNOWN_REQUEST_TYPE = 0;
MAKE_I_CALL = 1; // 拨打 I-CALL
}
/* ----------Part-2 :Publish/Subscribe消息定义---------- */
//topic:"user_id"
message UserID {
string user_id = 1;
}
代码⽣生成
$ protoc --cpp_out=./ UserInfo.proto # ⽣生成 C++ 代码
UserInfo.pb.h和UserInfo.pb.cc
$ protoc --java_out=./ UserInfo.proto # ⽣生成 Java 代码
其他资料
https://gitee.com/solym/ZeroMQ-Guide-Zh
https://github.com/booksbyus/zguide
ZMQ接口文档的官方网站 : http://api.zeromq.org/
ZMQ接口文档的百度网盘下载地址(英文):http://pan.baidu.com/s/1jGDqXfS
● zmq - 0MQ 轻量级消息传输内核
● zmq_bind - 绑定一个socket
● zmq_close - 关闭ZMQ socket
● zmq_connect - 由一个socket创建一个对外连接
● zmq_ctx_destroy - 销毁一个ZMQ环境上下文
● zmq_ctx_get - 得到环境上下文的属性
● zmq_ctx_new – 创建一个新的ZMQ 环境上下文
● zmq_ctx_set - 设置环境上下文属性
● zmq_ctx_shutdown - 停止一个ZMQ context
● zmq_socket_monitor - 注册一个监控回调函数
● zmq_ctx_term - 终结一个ZMQ环境上下文
● zmq_curve – 安全的认证方式和保密方式
● zmq_curve_keypair - 生成一个新的CURVE 密钥对
● zmq_disconnect - 断开一个socket的连接
● zmq_errno – 返回errno的值给调用此函数的线程
● zmq_init - 初始化ZMQ环境上下文 (已弃用)
● zmq_z85_decode – 从一个用Z85算法生成的文本中解析出二进制密码
● zmq_z85_encode – 使用Z85算法对一个二进制秘钥进行加密,输出可打印的文本
● zmq_version – 返回ZMQ链接库的版本
● zmq_unbind - 停止连接外来的请求
● zmq_plain - 明文认证
● zmq_null - 无安全和加密
● zmq_msg_more - 指出是不是还有更多的消息部分可以接收
● zmq_msg_init - 初始化一个空的ZMQ消息结构
● zmq_msg_init_data - 从一个指定的存储空间中初始化一个ZMQ消息对象的数据
● zmq_msg_init_size - 使用一个指定的空间大小初始化ZMQ消息对象
● zmq_msg_move - 将一个消息里面的内容移动到另一个消息里面
● zmq_msg_copy - 把一个消息的内容复制到另一个消息中
● zmq_msg_data - 返回消息内容的指针
● zmq_msg_get - 获取消息的性质
● zmq_msg_set - 设置消息的性质
● zmq_msg_size - 以字节为单位返回消息内容的大小
● zmq_msg_recv - 从一个socket中接受一个消息帧
● zmq_msg_close – 释放一个ZMQ消息
● zmq_msg_send – 从一个socket发送一个消息帧
● zmq_term - 终结ZMQ环境上下文(context)(已弃用)
● zmq_strerror - 获取ZMQ错误描述字符串
● zmq_poll - I/O多路技术
● zmq_tcp – 使用TCP协议的ØMQ网络单播协议
● zmq_recv – 从一个socket上接收一个消息帧
● zmq_send – 在一个socket上发送一个消息帧
● zmq_proxy – 开始ZMQ内置代理
● zmq_recvmsg – 从一个socket上接收一个消息帧 (已弃用)
● zmq_sendmsg – 从一个socket上发送一个消息帧 (已弃用)
● zmq_ipc – ZMQ本地进程间通信传输协议
● zmq_proxy_steerable – 以STOP/RESUME/TERMINATE控制方式开启内置的ZMQ代理
● zmq_inproc – ØMQ 本地进程内(线程间)传输方式
● zmq_pgm – ØMQ 使用PGM 进行可靠的多路传输
● zmq_send_const – 从一个socket上发送一个固定内存数据
● zmq_socket – 创建ZMQ套接字
● zmq_setsockopt –设置ZMQ socket的属性
● zmq_getsockopt – 获取ZMQ socket的属性
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)