2015-10-10 39 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套接字,所以我不知道這種方法是否可行。