您的位置:首页 > 其它

zeromq安装使用

2015-10-04 12:02 344 查看
一、zeromq简介

zeromq的官方网站:http://zeromq.org/ , 简介如下:

ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework.
It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast.
You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply.
It's fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems.
ZeroMQ is from iMatix and is LGPLv3 open source.


二、安装

从官网下载zeromq-4.0.7.tar.gz,

tar zxvf zeromq-4.0.7.tar.gz
cd zeromq-4.0.7
./configure --prefix=/usr/local/zeromq
make
make install


root@ubuntu:zeromq-4.0.7# ls /usr/local/zeromq/
bin include lib share

三、使用

以下是用zeromq实现的简单的echo服务器:

zmqsvr.c:

#include "zmq.h"
#include <string.h>
#include <unistd.h>

int main(void)
{
void* zmq_ctx = zmq_ctx_new();
void* zmq_sock = zmq_socket(zmq_ctx, ZMQ_REP);
zmq_bind(zmq_sock, "tcp://*:5555");

printf("start listen for socket...\n");
int seq = 0;
while (1)
{
printf("\nloop seq: %d\n", seq++);
int msg_size = 0;
char buf[10] = {0};
zmq_msg_t request;
zmq_msg_init(&request);
zmq_msg_recv(&request, zmq_sock, 0);
msg_size = zmq_msg_size(&request);
memcpy(buf, zmq_msg_data(&request), msg_size);
printf("recv request: %s\n", buf);
zmq_msg_close(&request);

sleep(1);

zmq_msg_t reply;
zmq_msg_init_size(&reply, msg_size);
memcpy(zmq_msg_data(&reply), buf, msg_size);
printf("send reply: %s\n", buf);
zmq_msg_send(&reply, zmq_sock, 0);
zmq_msg_close(&reply);
}

sleep(1);
zmq_close(zmq_sock);
zmq_ctx_destroy(zmq_ctx);

return 0;
}


zmqcli.c:

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
void* zmq_ctx = zmq_ctx_new();
void* zmq_sock = zmq_socket(zmq_ctx, ZMQ_REQ);
zmq_connect(zmq_sock, "tcp://localhost:5555");

int index = 0;
for (index = 0; index < 10; index++)
{
printf("\nloop seq:%d\n", index);
zmq_msg_t request;
zmq_msg_init_size(&request, 6);
char buf[10] = {0};
sprintf(buf, "hello%d", index);
memcpy(zmq_msg_data(&request), buf, 6);
printf("send request: %s\n", buf);
zmq_msg_send(&request, zmq_sock, 0);
zmq_msg_close(&request);

memset(buf, 0, sizeof(buf));
zmq_msg_t reply;
zmq_msg_init(&reply);
zmq_msg_recv(&reply, zmq_sock, 0);
memcpy(buf, zmq_msg_data(&reply), zmq_msg_size(&reply));
printf("recv reply: %s\n", buf);
zmq_msg_close(&reply);
}

sleep(1);
zmq_close(zmq_sock);
zmq_ctx_destroy(zmq_ctx);

return 0;
}


zmqsvr和zmqcli实现了从client端发送helloi, server端收到后并echo回给client。

makefile如下:

TARGET = zmqsvr zmqcli

all: $(TARGET)

CFLAGS = -g -I/usr/local/zeromq/include/ -Wall
LDFLAGS = -L/usr/local/zeromq/lib/

zmqsvr:zmqsvr.c
gcc $(CFLAGS) $< -o $@ $(LDFLAGS) -lzmq

zmqcli:zmqcli.c
gcc $(CFLAGS) $< -o $@ $(LDFLAGS) -lzmq

clean:
rm -rf $(TARGET)


root@ubuntu:zeromq# make
gcc -g -I/usr/local/zeromq/include/ -Wall zmqsvr.c -o zmqsvr -L/usr/local/zeromq/lib/ -lzmq
gcc -g -I/usr/local/zeromq/include/ -Wall zmqcli.c -o zmqcli -L/usr/local/zeromq/lib/ -lzmq

root@ubuntu:zeromq# ./zmqcli

loop seq:0
send request: hello0
recv reply: hello0

loop seq:1
send request: hello1
recv reply: hello1

...

loop seq:9
send request: hello9
recv reply: hello9


另一个终端里:

mamo@ubuntu:zeromq$ ./zmqsvr
start listen for socket...

loop seq: 0
recv request: hello0
send reply: hello0

...

loop seq: 9
recv request: hello9
send reply: hello9

loop seq: 10


(如果运行时出现cannot found libzmq.so.4之类的错误,可以使用 strace ./zmqsvr查看调用的libzmq.so.4的路径,比如/lib/i386-linux-gnu/i686/,将libzmq.so.4复制到该路径即可。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: