zeromq学习,第一章

zeromq学习,第一章

Asynchronous Input/Output(AIO):AIO可以在input/output的请求到来之前继续执行。AIO在实时应用程序中是必须的。使用AIO可以映射多个任务到一个线程上去。
首先zeromq的设计是弱中间人的(brokerless,相对于ActiveMQ、RabbitMQ等,使用0zq的程序就可以直接和其他的节点通信而不通过broker的代理。),zeromq不会存储信息到磁盘上,然而可能使用本地的交换文件来存储消息(当设置了zmq.SWAP时)。

示例:HelloWorld(server)

server

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

int main(int argc, char *argv[])
{
    void *context = zmq_ctx_new();
    void *respond = zmq_socket(context, ZMQ_REQ);
    zmq_bind(respond, "tcp://*:4040");

    printf("starting\n");

    for (;;)
    {
        zmq_msg_t request;
        zmq_msg_init(&request);
        zmq_msg_recv(&request, respond, 0);
        printf("received: %s\n", zmq_msg_data(&request));
        zmq_msg_close(&request);
        sleep(1);

        zmq_msg_t reply;
        zmq_msg_init_size(&reply, strlen("world"));
        memcpy(zmq_msg_data(&reply), "world", 5);
        zmq_msg_send(&reply, respond, 0);
        zmq_msg_close(&reply);
    }

    zmq_close(respond);
    zmq_ctx_destroy(context);

    return 0;

示例:Helloworld(client)

client
 1 
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 #include <string.h>
 5 #include <zmq.h>
 6 
 7 int main(int argc, char *argv[])
 8 {
 9     void *context = zmq_ctx_new();
10     printf("client starting\n");
11 
12     void *request = zmq_socket(context, ZMQ_REQ);
13     zmq_connect(request, "tcp://localhost:4040");
14 
15     int count = 0;
16 
17     for (;;)
18     {
19         zmq_msg_t req;
20         zmq_msg_init_size(&req, strlen("hello"));
21         memcpy(zmq_msg_data(&req), "hello", 5);
22         printf("send msg hello, count = %d\n", count);
23         zmq_msg_send(&req, request, 0);
24         zmq_msg_close(&req);
25 
26         zmq_msg_t reply;
27         zmq_msg_init(&reply);
28         zmq_msg_recv(&reply, request, 0);
29         printf("recv msg %s, count = %d\n", zmq_msg_data(&reply), count);
30         zmq_msg_close(&reply);
31         count++;
32     }
33 
34     zmq_close(request);
35     zmq_ctx_destroy(context);
36 
37     return 0;
38 }
39 
40 

这里使用了最基本的请求应答架构。详细解析代码:
第一步:创建了context和socket,zmq_ctx_new方法创建了一个新的 context,这是线程安全的,即一个context可用于多个线程操作。 zmq_socket方法创建了一个在context中定义的socket, ZeroMQ的socket不是线程安全。传统的socket是同步的,然而ZMQ的socket在客户端和服务端都维护了一个队列来管理request-reply的异步模式。ZMQ自动的处理连接、重连、断开连接和内容交付。
服务端创建了Reply(ZMQ_REP)用来处理接收消息并应答消息。如果客户端和服务端遗失(lost),应答的消息将在没有任何通知的情况下丢掉。
客户端创建了一个Request(ZMQ_REQ)来发送消息并接收来自服务的应答。ZMQ_REQ下不会丢弃任何信息,不管是没有没有可用与发送消息的服务或是服务处于忙状态,所有的发送操作zmq_send函数会阻塞,直到一个服务变为可用于发送消息。ZMQ_REQ和ZMQ_REP、ZMQ_ROUTER类型兼容。
消息的发送zmq_send函数的第三个参数是flags,是ZMQ_DONTWAIT或ZMQ_SNDMORE。ZMQ_DONTWAIT表明消息是异步的发送。ZMQ_SNDMORE表明消息有多部分,其余的部分已经“在路上了”。消息接收函数zmq_msg_recv函数,如服务端,在先前接收的消息是无效的。第三个参数flugs可能是ZMQ_DONTWAIT。

先睡觉了

你可能感兴趣的:(zeromq学习,第一章)