ZeroMQ「パブリッシュ/サブスクリプション」モデルのC++コード


ZeroMQ環境の構築は言うまでもなく、前にも言っていました.
ZeroMQの「パブリッシュ/サブスクリプション」モデルのC++コードを見てみましょう.
     pub.cppコードは次のとおりです.
#include 
#include 
#include 
#include 
#include 
#include "zmq.h"

int main()
{
    void* context = zmq_ctx_new();
    assert(context != NULL);

    void* publisher = zmq_socket(context, ZMQ_PUB);
    assert(publisher != NULL);

    int ret = zmq_bind(publisher, "tcp://*:5555");
    assert(ret == 0);

    int i = 0;
    while(1)
    {
        char szBuf[1024] = {0};
        snprintf(szBuf, sizeof(szBuf), "server i=%d", i);
        ret = zmq_send(publisher, szBuf, strlen(szBuf) + 1, 0);
        i++;

        sleep(1);
    }

    zmq_close (publisher);
    zmq_ctx_destroy (context);

    return 0;
}

sub.cppコードは次のとおりです.
#include 
#include 
#include 
#include 
#include "zmq.h"

int main()
{
    printf("Hello world!
"); void* context = zmq_ctx_new(); assert(context != NULL); void* subscriber = zmq_socket(context, ZMQ_SUB); assert(subscriber != NULL); int ret = zmq_connect(subscriber, "tcp://localhost:5555"); assert(ret == 0); ret = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "", 0); assert(ret == 0); while(1) { printf("into while
"); char szBuf[1024] = {0}; ret = zmq_recv(subscriber, szBuf, sizeof(szBuf) - 1, 0); if (ret > 0) { printf("%s
", szBuf); } } zmq_close(subscriber); zmq_ctx_destroy(context); return 0; }

先にパブリッシャーを起動すると、購読者は一部のメッセージを逃し、取り返しがつかない.
実際の効果を見てみましょう(1人のパブリッシャーと2人のサブスクライバが開いています):
ubuntu@VM-0-15-ubuntu:~/taoge/zmq/test$ ./server 
ubuntu@VM-0-15-ubuntu:~/taoge/zmq/test$ ./client 
Hello world!
into while
server i=21
into while
server i=22
into while
server i=23
ubuntu@VM-0-15-ubuntu:~/taoge/zmq/test$ ./client 
Hello world!
into while
server i=57
into while
server i=58
into while
server i=59

OK、あまり言わない.