zmq常用通信模式

zmq是一个消息队列。可以在进程内、进程间、TCP、多播中,以消息为单位传输数据,而不是socket的字节流。官方主页上有下载、使用、文档,蛮全的。

常用模式有:Request-Reply,Publish-Subscribe,Parallel Pipeline。

Request-Reply

request

[cpp]  view plain copy
  1. zmq::context_t context (1);  
  2. zmq::socket_t socket (context, ZMQ_REQ);  
  3. //Send the request  
  4. zmq::message_t request(6);  
  5. memcpy ((void *)request.data(), "Hello", 5);  
  6. socket.send(request);  
  7. //Get the reply  
  8. zmq::message_t reply;  
  9. socket.recv(&reply);  

server

[cpp]  view plain copy
  1. zmq::context_t context (1);  
  2. zmq::socket_t socket(context, ZMQ_REP);  
  3. socket.bind ("tcp://*:5555");  
  4. while (true) {  
  5.   zmq::message_t request;  
  6.   //  Wait for next request from client  
  7.   socket.recv (&request);  
  8.   std::cout << "Received Hello" << std::endl;  
  9.   //  Do some 'work'  
  10.   sleep (1);  
  11.   //  Send reply back to client  
  12.   zmq::message_t reply (5);  
  13.   memcpy ((void *) reply.data (), "World", 5);  
  14.   socket.send (reply);  
  15. }  

Publish-Subscribe

publisher

[cpp]  view plain copy
  1. zmq::context_t context (1);  
  2. zmq::socket_t publisher (context, ZMQ_PUB);  
  3. publisher.bind("tcp://*:5556");  
  4. publisher.send(message);  
subscriber

[cpp]  view plain copy
  1. zmq::context_t context (1);  
  2. zmq::socket_t subscriber (context, ZMQ_SUB);  
  3. subscriber.connect("tcp://localhost:5556");  
  4. const char *filter = "";  
  5. subscriber.setsockopt(ZMQ_SUBSCRIBE, filter, strlen (filter));  
  6. zmq::message_t update;  
  7. subscriber.recv(&update);  

Parallel Pipeline

ventilator
[cpp]  view plain copy
  1. zmq::context_t context (1);  
  2. //  Socket to send messages on  
  3. zmq::socket_t  sender(context, ZMQ_PUSH);  
  4. sender.bind("tcp://*:5557");  
  5. //  通知sink开始处理任务  
  6. zmq::socket_t sink(context, ZMQ_PUSH);  
  7. sink.connect("tcp://localhost:5558");  
  8. zmq::message_t message(2);  
  9. memcpy(message.data(), "0", 1);  
  10. sink.send(message);  
  11. //开始往pipeline发送数据  
  12. message.rebuild(10);  
  13. sprintf ((char *) message.data(), "%d", workload);  
  14. sender.send(message);      

worker
[cpp]  view plain copy
  1. zmq::context_t context(1);  
  2.   
  3. //  Socket to receive messages on  
  4. zmq::socket_t receiver(context, ZMQ_PULL);  
  5. receiver.connect("tcp://localhost:5557");  
  6.   
  7. //  Socket to send messages to  
  8. zmq::socket_t sender(context, ZMQ_PUSH);  
  9. sender.connect("tcp://localhost:5558");  
  10.   
  11. //  Process tasks forever  
  12. while (1) {  
  13.   receiver.recv(&message);  
  14.   //  Send results to sink  
  15.   message.rebuild();  
  16.   sender.send(message);  
  17. }  

sink
[cpp]  view plain copy
  1. //  Prepare our context and socket  
  2. zmq::context_t context(1);  
  3. zmq::socket_t receiver(context,ZMQ_PULL);  
  4. receiver.bind("tcp://*:5558");  
  5.   
  6. //  Wait for start of batch  
  7. zmq::message_t message;  
  8. receiver.recv(&message);  
  9. //receive from worker  
  10. receiver.recv(&message);  

你可能感兴趣的:(网络编程)