ZeroMQ Lazy Pirate Pattern
来源:互联网 发布:mac无法切换输入法 编辑:程序博客网 时间:2024/06/06 21:35
服务端:
#include <assert.h>#include <iostream>#include <tchar.h>#include <zmq.h>using namespace std;#pragma comment(lib,"libzmq.lib")void main(int argc,TCHAR*argv[]){void *ctx;ctx = zmq_init(1);assert(ctx);void *s;s = zmq_socket(ctx,ZMQ_REP);assert(s);int rc;rc = zmq_bind(s,"tcp://127.0.0.1:6000");assert(0 == rc);int nCycles = 0;zmq_msg_t msg;while(1){char *re_string = NULL;zmq_msg_init(&msg);zmq_recv(s,&msg,0);re_string = (char*)zmq_msg_data(&msg);cout<<"main recv : "<<re_string<<endl;zmq_msg_close(&msg);nCycles++;//接收四次数据后,让服务器退出,模拟服务器出故障// if(nCycles > 4)// {// cout<<"Simulate a crash"<<endl;// break;// }//接收三次数据后,让服务器返回数据变慢,模拟客户端超时收不到数据if(nCycles > 3){cout<<"Simulate CPU overload"<<endl;Sleep(2000);}cout<<"Normal "<<endl;zmq_msg_init_size(&msg,strlen(re_string)+1);memcpy(zmq_msg_data(&msg),re_string,strlen(re_string)+1);zmq_send(s,&msg,0);zmq_msg_close(&msg);}zmq_close(s);zmq_term(ctx);}
客户端:
#include <assert.h>#include <iostream>#include <tchar.h>#include <zmq.h>using namespace std;#pragma comment(lib,"libzmq.lib")void main(int argc,TCHAR*argv[]){void *ctx;ctx = zmq_init(1);assert(ctx);void *s;s = zmq_socket(ctx,ZMQ_REQ);assert(s);int rc;rc = zmq_connect(s,"tcp://127.0.0.1:6000");assert(0 == rc); int left_retries = 3;int nsequence = 0;zmq_msg_t msg;while(left_retries){char sd_string[20] = {0};sprintf(sd_string,"num: %d",nsequence++);zmq_msg_init_size(&msg,strlen(sd_string)+1);memcpy(zmq_msg_data(&msg),sd_string,strlen(sd_string)+1);zmq_send(s,&msg,0);zmq_msg_close(&msg);Sleep(1000);bool expect_reply = true; while(expect_reply) {zmq_pollitem_t items = {s,0,ZMQ_POLLIN,0};zmq_poll(&items,1,3000);if(items.revents & ZMQ_POLLIN){char *re_string = NULL;zmq_msg_init(&msg);zmq_recv(s,&msg,0);re_string = (char*)zmq_msg_data(&msg);zmq_msg_close(&msg);if(0 == strcmp(sd_string,re_string)){cout<<"server reply ok : "<<re_string<<endl;left_retries = 3;expect_reply = false;}else{cout<<"recv error data from server"<<endl;} }else if(--left_retries == 0){cout<<"Server offline,abandonint"<<endl;expect_reply = false;break;}else{cout<<"no response from server,retrying..."<<endl;zmq_close(s);s = zmq_socket(ctx,ZMQ_REQ);assert(s);rc = zmq_connect(s,"tcp://127.0.0.1:6000");assert(0 == rc);zmq_msg_init_size(&msg,strlen(sd_string)+1);memcpy(zmq_msg_data(&msg),sd_string,strlen(sd_string)+1);zmq_send(s,&msg,0);zmq_msg_close(&msg);}}}zmq_close(s);zmq_term(ctx);}
- ZeroMQ Lazy Pirate Pattern
- Lazy Function Definition Pattern
- .[ZeroMQ] messaging pattern -- publish/subscribe
- zeromq
- zeromq
- zeroMQ
- Zeromq
- zeroMQ
- zeroMQ
- zeromq
- zeromq
- zeromq
- ZeroMQ
- zeromq
- ZeroMQ
- ZeroMQ
- ZeroMQ
- ZeroMQ
- 嵌入式设备上安装telnet服务
- Linux 显示内存不足释疑
- Silverlight开发历程—(绘制矢量图之Line)
- Win32 结构化异常处理(SEH)探秘
- json缓存问题
- ZeroMQ Lazy Pirate Pattern
- 架构实战经验一:架构设计中的大小端模式(little-big endian)
- 技术人员如何转型为产品经理
- MLu32.dll V1.0 使用说明
- wamcc:将Prolog编译成C (No.7-1)
- 关于内存管理之泄露与越界
- Nexus介绍(maven)
- linux多线程编程(有关线程操作的函数)
- android 之xml 解析