使用 CZMQ 时无法获取套接字标识 zsock_new_stream

Cant get socket identity when using CZMQ's zsock_new_stream

为什么我无法获取通过 zsock_new_stream 创建的套接字的标识? zmq_getsockopt returns -1.

zsock_t *socket = zsock_new_stream("tcp://127.0.0.1:5555");

uint8_t id [256];
size_t id_size = 256;

int rc = zmq_getsockopt (socket, ZMQ_IDENTITY, id, &id_size);
assert(rc == 0);

使用旧的已弃用的 zsocket 工作正常,见下文:

zctx_t *ctx = zctx_new();
void *sock = zsocket_new(ctx, ZMQ_STREAM);
int rc = zsocket_connect(sock, "tcp://127.0.0.1:5555");

uint8_t id [256];
size_t id_size = 256;

int rc = zmq_getsockopt (socket, ZMQ_IDENTITY, id, &id_size);
assert (rc == 0);

是否存在使用 zsock_new_stream 的示例?

不,没有工作示例,因为 STREAM 套接字忽略了标识 属性。 czmq 实现遵循 ZMTP v3 protocole

引用,关于身份属性:

"A REQ, DEALER, or ROUTER peer connecting to a ROUTER MAY announce its identity, which is used as an addressing mechanism by the ROUTER socket. For all other socket types, the Identity property shall be ignored."

但是您始终可以通过多部分消息从客户端对等端向服务器发送一个 ID,其中您的 ID 在消息的第一帧中。另一方面,获取id只是读取接收到的消息的第一帧。

"socket operation on non socket" 错误的发生是因为您混淆了 CZMQ zsock_t 套接字对象和底层 ZeroMQ 套接字这两个独立的概念。您可以使用 zsock_resolve() 函数访问后者,因此以下工作(至少在它 returns 成功并填充 id 和 id_size 变量的意义上):

int rc = zmq_getsockopt (zsock_resolve(socket), ZMQ_IDENTITY, id, &id_size);

我怀疑 ZMTP 规范在这里不相关,因为 STREAM 套接字(根据定义)不实现 ZMTP 协议。话虽如此,我自己并没有使用过STREAM套接字,所以我不知道这种方法在实践中是否有效。