Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8101923
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: C/C++

2011-11-10 22:52:18

作者:gfree.wind@gmail.com
博客:blog.focus-linux.net      linuxfocus.blog.chinaunix.net

前段时间和crazyhadoop聊天中,他推荐了zeromq这个开源库。所以今天开始学习一下。看了一下zeromq的在线文档,感觉确实不错,准备学习一下。

我的目的是阅读zeromq的源代码,那么首先要学会去用zeromq,所以刚开始是zeromq的应用学习,然后再开始阅读其源代码。另外,为了重新拾起以前的C++,所以在学习zeromq的过程中,主要使用C++。

今天先来编译一下其示例程序吧。

首先要先安装zeromq,使用默认的选项./configure, make, make install。

然后是zeromq的server的示例代码
  1. #include <zmq.hpp>
  2. #include <string>
  3. #include <iostream>
  4. #include <unistd.h>

  5. int main () {
  6.     // Prepare our context and socket
  7.     zmq::context_t context (1);
  8.     zmq::socket_t socket (context, ZMQ_REP);
  9.     socket.bind ("tcp://*:5555");

  10.     while (true) {
  11.         zmq::message_t request;

  12.         // Wait for next request from client
  13.         socket.recv (&request);
  14.         std::cout << "Received Hello" << std::endl;

  15.         // Do some 'work'
  16.         sleep (1);

  17.         // Send reply back to client
  18.         zmq::message_t reply (5);
  19.         memcpy ((void *) reply.data (), "World", 5);
  20.         socket.send (reply);
  21.     }
  22.     return 0;
  23. }
编译:
  1. g++ -g -Wall -fPIC -I../../include -I../../utils -shared -c server.cpp -o server.o
  2. cc -L../../lib -g -lstdc++ -lzmq -o server server.o
在编译的时候,如果找不到zmq库,别忘了把安装路径加入到/etc/ld.so.conf中,并执行ldconfig。

下面是client的示例程序
  1. //
  2. // Hello World client
  3. // Connects REQ socket to tcp://localhost:5555
  4. // Sends "Hello" to server, expects "World" back
  5. //
  6. #include <zmq.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <unistd.h>

  10. int main (void)
  11. {
  12.     void *context = zmq_init (1);

  13.     // Socket to talk to server
  14.     printf ("Connecting to hello world server…\n");
  15.     void *requester = zmq_socket (context, ZMQ_REQ);
  16.     zmq_connect (requester, "tcp://localhost:5555");

  17.     int request_nbr;
  18.     for (request_nbr = 0; request_nbr != 10; request_nbr++) {
  19.         zmq_msg_t request;
  20.         zmq_msg_init_size (&request, 5);
  21.         memcpy (zmq_msg_data (&request), "Hello", 5);
  22.         printf ("Sending Hello %d…\n", request_nbr);
  23.         zmq_send (requester, &request, 0);
  24.         zmq_msg_close (&request);

  25.         zmq_msg_t reply;
  26.         zmq_msg_init (&reply);
  27.         zmq_recv (requester, &reply, 0);
  28.         printf ("Received World %d\n", request_nbr);
  29.         zmq_msg_close (&reply);
  30.     }
  31.     zmq_close (requester);
  32.     zmq_term (context);
  33.     return 0;
  34. }
编译:
  1. g++ -g -Wall -fPIC -I../../include -I../../utils -shared -c client.cpp -o client.o
  2. cc -L../../lib -g -lstdc++ -lzmq -o client client.o

下面运行一下:
  1. [xxx@xxx-vm-fc13 client]$ ./client
  2. Connecting to hello world server…
  3. Sending Hello 0…
  4. Received World 0
  5. Sending Hello 1…
  6. Received World 1
  7. Sending Hello 2…
  8. Received World 2
  9. Sending Hello 3…
  10. Received World 3
  11. Sending Hello 4…
  12. Received World 4
  13. Sending Hello 5…
  14. ^C
  15. [xxx@xxx-vm-fc13 client]$
  1. [xxx@xxx-vm-fc13 server]$ ./server
  2. Received Hello
  3. Received Hello
  4. Received Hello
  5. Received Hello
  6. Received Hello
  7. Received Hello
  8. ^C
  9. [xxx@xxx-vm-fc13 server]$

虽然使用的是示例程序,但是从代码上看,使用zeromq确实比直接使用socket要简单方便的多。更何况据说还高效。

今天只是简单的试用zeromq,以后就慢慢开始深入了。

参考:
阅读(34280) | 评论(3) | 转发(2) |
给主人留下些什么吧!~~

trench10222013-11-06 15:59:51

写得真好!赞一个!

bluegreen3152013-07-11 15:08:12

请问如何在windows下zeromq呢?