#include<zmq.h>#include <string.h>/*g++ req-rep-server.cpp -lzmq -g -O0 -o objs/req-rep-server*/int main(int argc, char** argv){ void* context = zmq_ctx_new(); void* responder = zmq_socket(context, ZMQ_REP); zmq_bind(responder, "tcp://*:1990"); while(true){ zmq_msg_t request; zmq_msg_init(&request); zmq_msg_recv(&request, responder, 0); zmq_msg_close(&request); zmq_msg_t reply; zmq_msg_init_size(&reply, 6); memcpy(zmq_msg_data(&reply), "World", 6); zmq_msg_send(&reply, responder, 0); zmq_msg_close(&reply); } zmq_close(responder); zmq_ctx_destroy(context); return 0;}
#include <zmq.h>#include <string.h>#include <unistd.h>/*g++ req-rep-client.cpp -lzmq -g -O0 -o objs/req-rep-client*/int main(int argc, char** argv){ void* context = zmq_ctx_new(); void* requester = zmq_socket(context, ZMQ_REQ); zmq_connect(requester, "tcp://localhost:1990"); for(;;){ zmq_msg_t request; zmq_msg_init_size(&request, 5); memcpy(zmq_msg_data(&request), "Hello", 5); zmq_msg_send(&request, requester, 0); zmq_msg_close(&request); sleep(1); zmq_msg_t reply; zmq_msg_init(&reply); zmq_msg_recv(&reply, requester, 0); printf("get reply: %s\n", (char*)zmq_msg_data(&reply)); zmq_msg_close(&reply); sleep(1); } zmq_close(requester); zmq_ctx_destroy(context); return 0;}
/**g++ pub-sub-publisher.cpp -lzmq -g -O0 -g -o objs/pub-sub-publisher*/#include <stdlib.h>#include <string.h>#include <unistd.h>#include <zmq.h>int main(int argc, char** argv){ void* context = zmq_ctx_new(); void* publisher = zmq_socket(context, ZMQ_PUB); zmq_bind(publisher, "tcp://*:1990"); srand(0); char* filter = (argc > 1)? argv[1] : (char*)"xxxx "; while(true){ char buf[64]; snprintf(buf, sizeof(buf), "%s a=%d b=%d c=%d", filter, rand()%1000, rand()%1000, rand()%1000); zmq_msg_t msg; zmq_msg_init_size(&msg, strlen(buf)+1); memcpy(zmq_msg_data(&msg), buf, strlen(buf)+1); zmq_msg_send(&msg, publisher, 0); zmq_msg_close(&msg); printf("filter=\"%s\", publish message: %s\n", filter, buf); sleep(1); } zmq_close(publisher); zmq_ctx_destroy(context); return 0;}
/**g++ pub-sub-subscriber.cpp -lzmq -g -O0 -g -o objs/pub-sub-subscriber*/#include <stdlib.h>#include <string.h>#include <zmq.h>int main(int argc, char** argv){ void* context = zmq_ctx_new(); void* subscriber = zmq_socket(context, ZMQ_SUB); zmq_connect(subscriber, "tcp://localhost:1990"); char* filter = (argc > 1)? argv[1] : (char*)"xxxx "; zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, filter, strlen(filter)); while(true){ zmq_msg_t msg; zmq_msg_init(&msg); zmq_msg_recv(&msg, subscriber, 0); printf("filter=\"%s\" msg: %s\n", filter, zmq_msg_data(&msg)); zmq_msg_close(&msg); } zmq_close(subscriber); zmq_ctx_destroy(context); return 0;}
/**g++ div-con-ventilator.cpp -lzmq -g -O0 -o objs/div-con-ventilator*/#include <zmq.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <unistd.h>int main(int argc, char** argv){ void* context = zmq_ctx_new(); void* ventilator = zmq_socket(context, ZMQ_PUSH); zmq_bind(ventilator, "tcp://*:1990"); srand(0); int task_num = (argc > 1)? atoi(argv[1]) : 100; printf("ventilator will dispatch %d task to worker.\n", task_num); // we must wait for worker to connect to the ventilator, // if there is 10/100 workers connected, we will dispatch to the 10 workers, // the left 90 workers will get workers when they connect to ventilator. printf("when all worker is online, press any key to dispatch tasks..."); getchar(); while(true){ for(int i = 0; i < task_num; i++){ printf("start to dispatch %d task\n", i + 1); zmq_msg_t msg; zmq_msg_init_size(&msg, 4); int time = rand() % 10; memcpy(zmq_msg_data(&msg), &time, 4); zmq_msg_send(&msg, ventilator, 0); printf("dispatch %d task completed\n", i + 1); } sleep(10); // if there is new worker, we can dispatch task to it. printf("dispatch the task again!\n"); } zmq_close(ventilator); zmq_ctx_destroy(context); return 0;}
/**g++ div-con-worker.cpp -lzmq -g -O0 -o objs/div-con-worker*/#include <zmq.h>#include <stdlib.h>#include <string.h>#include <unistd.h>int main(int argc, char** argv){ void* context = zmq_ctx_new(); void* worker_receiver = zmq_socket(context, ZMQ_PULL); zmq_connect(worker_receiver, "tcp://localhost:1990"); void* sink_sender = zmq_socket(context, ZMQ_PUSH); zmq_connect(sink_sender, "tcp://localhost:1991"); while(true){ int time; // pull work if(true){ zmq_msg_t msg; zmq_msg_init(&msg); zmq_msg_recv(&msg, worker_receiver, 0); memcpy(&time, zmq_msg_data(&msg), 4); zmq_msg_close(&msg); printf("get a worker, time=%d\n", time); } // do work sleep(time); printf("work completed.\n"); // report work if(true){ char buf[64]; snprintf(buf, sizeof(buf), "time=%d", time); zmq_msg_t msg; zmq_msg_init_size(&msg, strlen(buf) + 1); memcpy(zmq_msg_data(&msg), buf, strlen(buf) + 1); zmq_msg_send(&msg, sink_sender, 0); zmq_msg_close(&msg); printf("work report to sink completed, %s\n", buf); } } zmq_close(sink_sender); zmq_close(worker_receiver); zmq_ctx_destroy(context); return 0;}
/**g++ div-con-sink.cpp -lzmq -g -O0 -o objs/div-con-sink*/#include <zmq.h>#include <stdlib.h>int main(int argc, char** argv){ void* context = zmq_ctx_new(); void* sink = zmq_socket(context, ZMQ_PULL); zmq_bind(sink, "tcp://*:1991"); while(true){ zmq_msg_t msg; zmq_msg_init(&msg); zmq_msg_recv(&msg, sink, 0); printf("sink get a work report: %s\n", zmq_msg_data(&msg)); } zmq_close(sink); zmq_ctx_destroy(context); return 0;}
- zmq: basic patterns Request-Reply, Publisher-Subscriber, Denvilator-worker-sink.
- 继 <ZMQ的学习和研究> Request-reply worker in C++
- zmq: request-reply multiple clients to multiple server, brute force way
- 继 <ZMQ的学习和研究> 学习代码 Request-reply client in C++
- 继 <ZMQ的学习和研究> Request-reply broker in C++
- 消息中间件ActiveMQ(4)--Publisher/Subscriber实验
- C# Publisher/Subscriber Pattern, keyword event/delegate
- Writing a Simple Publisher and Subscriber (C++)
- ROS的学习 验证publisher和subscriber
- ros_Python_Writing a Simple Publisher and Subscriber
- Request-reply messaging
- Passive STS request to reply
- [收藏]SOA:The Subscriber-Publisher Model, Introduction and Implementation
- [收藏]SOA:The Subscriber-Publisher Model, Introduction and Implementation
- [收藏]SOA:The Subscriber-Publisher Model, Introduction and Implementation
- [收藏]SOA:The Subscriber-Publisher Model, Introduction and Implementation
- AMQ: Publisher/Subscriber(发布/订阅者)消息模式开发流程
- Publisher/Subscriber(发布/订阅者)消息模式开发流程
- 高通fastcv编译出现“android.view.WindowManager$BadTokenExcep
- 指针和整数,指针和数组,new和delete,cstring和string
- FFPLAY的原理 .
- CVE-2012-1823 php-cgi远程代码执行
- Java基础_运算符
- zmq: basic patterns Request-Reply, Publisher-Subscriber, Denvilator-worker-sink.
- ACM 3984 迷宫问题
- 独立博客地址:www.isaced.com
- 9个最常见IE的Bug及其fix
- yum找不到安装包
- nodejs下function,new function和this的研究
- 一位国企高管对年轻人的忠告
- php curl请求信息和返回信息
- 几个你可能从来没有用过的HTML标识