您的位置:首页 > 其它

ZeroMQ学习 (四)请求-应答模式

2018-03-04 11:22 218 查看

6 请求-应答模式

​ 请求-应答模式,REQ-REP必须同步的进行,即,REQ套接字必须先发送请求,然后等待应答;REP必须先接受请求,然后发送应答。一旦打乱这个顺序,将造成错误,套接字将无法继续工作。请求端源码request.cpp:​
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main (void)
{
   void *context = zmq_ctx_new();
   void *requster = zmq_socket (context, ZMQ_REQ);
   zmq_connect (requster, "tcp://127.0.0.1:5555");
int ret;
   while (1)
  {
       zmq_send (requster, "hello", 5, 0);

       sleep (1);

       char buf[256];
       ret = zmq_recv (requster, buf, sizeof(buf) - 1, 0);
    buf[ret] = '\0';
       printf ("recv msg %s\n", buf);

  }
   // 程序不会运行到这里,以下只是演示我们应该如何结束
   zmq_close (requster);
   zmq_ctx_destroy(context);
   return 0;
}编译命令:g++ request.cpp -lzmq -o request应答端源码response.cpp:#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main (void)
{
   void *context = zmq_ctx_new();

   // 与客户端通信的套接字
   void *responder = zmq_socket (context, ZMQ_REP);
   zmq_bind (responder, "tcp://*:5555");
int ret;
   while (1)
  {
       // 等待客户端请求
       char buf[256];
    /*返回值代表读到的字节个数,失败返回-1并且设置errno*/
       ret = zmq_recv (responder, buf, sizeof(buf) - 1, 0);
    buf[ret] = '\0';
       printf ("recv msg %s\n", buf);


       sleep (1);

       // 返回应答
       memcpy (buf, "World", 5);
       zmq_send (responder, buf, 5,  0);
  }
   // 程序不会运行到这里,以下只是演示我们应该如何结束
   zmq_close (responder);
   zmq_ctx_destroy(context);
   return 0;
}
g++ response.cpp -lzmq -o response
​ 1. 可以看到,服务器与客户端依次打印,并且多开客户端的时候,服务器也能够通过一个zmq的套接字正常处理多个客户端的请求。​ 2. 服务器没有启动的时候,启动客户端也不会出错,ZMQ会自动帮你重新连接。​ 3. 原生套接字的常见问题,例如socket关闭后读写的问题,ZMQ都已经封装到API中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: