2015-10-10 27 views
2

时,无法获取套接字标识为什么我无法获得通过zsock_new_stream创建的套接字的标识? zmq_getsockopt返回-1。当使用CZMQ的zsock_new_stream

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的作品?

+0

也许你应该检查*为什么*'zmq_getsockopt'返回'-1'?必须有一些类似于'errno'的函数或从最后一个失败函数中获取错误的函数。 –

+0

好的,我检查了errno。它说“在非插座上的插座操作”。怎么会这样? czmq api指出zsock_new_stream创建一个流套接字。 – Koi

回答

0

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

报价,关于身份属性:

“A REQ,经销商或路由器等连接到路由器可以宣布其身份,它是用作由ROUTER插座的寻址机制对于所有其他。套接字类型,身份属性应被忽略。“

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

+0

谢谢。这就是我一直在做的,以解决它。在连接时,客户端收到由ID帧和零帧组成的消息。所以我只是将该帧添加到我发送的任何消息中。 – Koi

0

“套接字操作对非套接字”错误的发生是因为您混淆了CZMQ zsock_t套接字对象和底层ZeroMQ套接字的两个单独概念。您可以使用zsock_resolve()函数访问后者,所以下面的工作(至少在这个意义上,它成功返回,并填充ID和id_size变量):

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

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