nanomsg通信库的pubsub及survey

上传人:20****03 文档编号:152418345 上传时间:2020-11-23 格式:DOC 页数:14 大小:46KB
返回 下载 相关 举报
nanomsg通信库的pubsub及survey_第1页
第1页 / 共14页
nanomsg通信库的pubsub及survey_第2页
第2页 / 共14页
nanomsg通信库的pubsub及survey_第3页
第3页 / 共14页
nanomsg通信库的pubsub及survey_第4页
第4页 / 共14页
nanomsg通信库的pubsub及survey_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《nanomsg通信库的pubsub及survey》由会员分享,可在线阅读,更多相关《nanomsg通信库的pubsub及survey(14页珍藏版)》请在金锄头文库上搜索。

1、nanomsg通信库的pubsub及surveynanomsg实验pubsub发布订阅模式是很多消息中间件提供的常见功能。通过消息机制,能够将消息发布者和消息接收(消费)者进行解耦。pubsub模式也是nanomsg直接支持的一直消息模型之一,因此通过pubsub模式实验,同时也大致了解了下nanomsg的基础用法。服务端代码如下复制代码#include<stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#include <unistd.h>#include

2、<nanomsg/nn.h>#include <nanomsg/pubsub.h>void usage(const char *name) fprintf(stderr, %s bind urln, name);int main(int argc, char *argv) if(argc != 2) usage(argv0); exit(-1); const char *url = argv1; int sock = nn_socket(AF_SP, NN_PUB); if(sock < 0) fprintf (stderr, nn_socket failed:

3、%sn, nn_strerror (errno); exit(-1); if(nn_bind(sock, url) < 0) fprintf(stderr, nn_bind failed: %sn, nn_strerror(errno); exit(-1); while(1) time_t rawtime; struct tm * timeinfo; time (&rawtime); timeinfo = localtime (&rawtime); char *text = asctime (timeinfo); int textLen = strlen(text); t

4、exttextLen - 1 = ; printf (SERVER: PUBLISHING DATE %sn, text); nn_send(sock, text, textLen, 0); sleep(1); return 0;nanomsg使用非常简单,只要直接include nanomsg/nn.h,即可使用基本API。使用内置的通信模式,需要引入对应的头文件,如pubsub模式,引入nonomsg/pubsub.h即可。pubsub server,需要首先通过nn_socket调用创建socket,这里模仿了POSIX接口,函数返回一个文件描述符。因此直接通过判断返回值是否大于0,判断

5、是否创建成功。注意第二个参数为协议,在协议相关头文件中会定义对应的宏。然后所有操作都将基于这个文件描述符。和berkeley sockets一样,server需要bind一个端口,nanomsg需要bind一个url。目前nanomsg支持的格式有:* 进程内通信(inproc):url格式为inproc:/test* 进程间同in想(ipc):url格式为ipc:/tmp/test.ipc* tcp通信:url格式为tcp:/*:5555github上源码貌似已经支持websocket了。nanomsg的错误和UNIX相同,失败之后会设置errno,可以通过nn_strerror获取对应的错

6、误文本。bind完了之后,就可以通过nn_send函数向socket发送消息了。这个函数参数和berkeley sockets api接口类似。这里直接获取当前时间,然后发出给所有订阅者。客户端代码如下复制代码#include <stdio.h>#include <stdlib.h>#include <nanomsg/nn.h>#include <nanomsg/pubsub.h>int main(int argc, char *argv) if(argc != 3) fprintf(stderr, usage: %s NAME BIND_URL

7、n, argv0); exit(-1); const char *name = argv1; const char *url = argv2; int sock = nn_socket (AF_SP, NN_SUB); if(sock < 0) fprintf(stderr, fail to create socket: %sn, nn_strerror(errno); exit(-1); if(nn_setsockopt (sock, NN_SUB, NN_SUB_SUBSCRIBE, , 0) < 0) fprintf(stderr, fail to set sorket op

8、ts: %sn, nn_strerror(errno); exit(-1); if (nn_connect(sock, url) < 0) fprintf(stderr, fail to connect to %s : %sn, url, nn_strerror(errno); exit(-1); while ( 1 ) char *buf = NULL; int bytes = nn_recv (sock, &buf, NN_MSG, 0); printf (CLIENT (%s): RECEIVED %sn, name, buf); nn_freemsg (buf); nn_

9、shutdown(sock, 0); return 0;客户端初始化和服务端差不多,在连接服务端之前,需要通过nn_setsockopt将当前socket设置成消息订阅者。然后通过nn_connect连接发布者,参数和服务端bind的差不多,也是一个socket、一个url。这里的url要和服务端bind的url相同。之后就是一个死循环不停的接收发布者的消息。测试首先是编译,和普通c程序相同,只是增加链接nanomsg。gcc -o pubserver pubserver.c -lnanomsggcc -o pubclient pubclient.c -lnanomsg为了方便测试,写了一个简

10、单的shell脚本:代码如下复制代码#!/bin/bashBASE=$( cd $( dirname $0 ) && pwd )PUB=$BASE/pubserverSUB=$BASE/pubclientURL=tcp:/127.0.0.1:1234echo start pubserver to bind tcp: $URL$PUB tcp:/127.0.0.1:1234 &echo start to start pubclientfor(i = 0; i < 10; i+) do echo start client$i $SUB client$i $URL &a

11、mp; sleep 1donesleep 20echo kill all process and exitfor pid in jobs -pdo echo kill $pid kill $piddonewait脚本很简单,首先启动一个消息发布者,然后每秒启动一个消息接受者。等待20s之后,kill掉所有子进程。脚本的输出:代码如下复制代码start pubserver to bind tcp: tcp:/127.0.0.1:1234start to start pubclientstart client0SERVER: PUBLISHING DATE Tue Feb 17 15:12:11

12、2015start client1SERVER: PUBLISHING DATE Tue Feb 17 15:12:12 2015CLIENT (client0): RECEIVED Tue Feb 17 15:12:12 2015CLIENT (client1): RECEIVED Tue Feb 17 15:12:12 2015start client2SERVER: PUBLISHING DATE Tue Feb 17 15:12:13 2015CLIENT (client0): RECEIVED Tue Feb 17 15:12:13 2015CLIENT (client1): REC

13、EIVED Tue Feb 17 15:12:13 2015CLIENT (client2): RECEIVED Tue Feb 17 15:12:13 2015start client3SERVER: PUBLISHING DATE Tue Feb 17 15:12:14 2015CLIENT (client0): RECEIVED Tue Feb 17 15:12:14 2015CLIENT (client1): RECEIVED Tue Feb 17 15:12:14 2015CLIENT (client2): RECEIVED Tue Feb 17 15:12:14 2015.SERVER: PUBLISHING DATE Tue Feb 17 15:12:41 2015CLIENT (client0): RECEIVED Tue Feb 17 15:12:41 2015CLIENT (client1): RECEIVED Tue Feb 17 15:12:41 2015CLIENT (client2): RECEIVED Tue Feb 17 15:12:41 2015CLIENT (client3): RECEIVED Tue Feb 17 15:12:41 2015CLIENT (client4):

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号