czmq:查找 "PUB/SUB + security" 的代码示例

czmq: look for code example of "PUB/SUB + security"

我正在关注这篇文章:“http://hintjens.com/blog:49”。 "stonehouse"的测试代码使用"PUSH/PULL",我尝试修改为使用"PUB/SUB"。但是我最初天真的尝试失败了(下面的代码,适用于 PUSH/PULL)。有什么我想念的吗?顺便说一句,czmq 真的可以与 PUB/SUB 一起使用吗,因为即使我删除了与安全相关的行,它仍然不起作用。谢谢你的帮助。

#include <czmq.h>

int main (int argc, char **argv)
{
//  Create context and start authentication engine
zctx_t *ctx = zctx_new ();
zauth_t *auth = zauth_new (ctx);
zauth_set_verbose (auth, true);
zauth_allow (auth, "127.0.0.1");

zauth_configure_curve (auth, "*", CURVE_ALLOW_ANY);

if (argc == 1)
{   zcert_t *server_cert = zcert_new ();
    char *server_key = zcert_public_txt (server_cert);
    printf ("%d: BEGIN '%s' END\n", strlen (server_key), server_key);

    void *server = zsocket_new (ctx, ZMQ_PUB/*PUSH*/);
    zcert_apply (server_cert, server);
    zsocket_set_curve_server (server, 1);
    zsocket_bind (server, "tcp://*:9000");
    printf ("Hit any key to start sending...\n");
    getchar ();
    int i=5;
    while (i > 0)
    {   printf ("%d ", i); fflush (stdout);
        sleep (1);
        --i;
    }
    zstr_send (server, "Hello");
    printf ("sent\n");
    zcert_destroy (&server_cert);
}
else
{   zcert_t *client_cert = zcert_new ();

    void *client = zsocket_new (ctx, ZMQ_SUB/*PULL*/);
    zcert_apply (client_cert, client);
    zsocket_set_curve_serverkey (client, argv[1]);
    zsocket_connect (client, "tcp://127.0.0.1:9000");

    char *message = zstr_recv (client);
    printf ("received: %s\n", message);
    assert (streq (message, "Hello"));
    free (message);
    puts ("Stonehouse test OK");

    zcert_destroy (&client_cert);
}

zauth_destroy (&auth);
zctx_destroy (&ctx);
return 0;
}

我终于弄明白了:订阅者需要设置"ZMQ_SUBSCRIBE"的选项。否则,它什么也得不到。我以前假设相反,这是错误的。