2013-02-01 89 views
2

我有一個ZeroMQ套接字,它接收來自不同機器上多個進程的數據。在不更改數據內容的情況下,是否有任何方法可以確定數據的來源?具體來說,如果它來自TCP連接,我希望發件人的IP地址。有什麼方法可以告訴ZeroMQ消息來自哪裏?

回答

4

不,沒有辦法從ZeroMq套接字獲取發件人IP。這些信息隱藏在ZeroMq的實現層中。你有幾個選擇來解決這個問題,一個是改變正在傳遞的消息並簡單地將發送者IP添加到消息本身,另一個是使用多部分消息。

從ZeroMq zmq_send() API文檔(3.2.2):

甲ØMQ消息由1個或多個消息部分。每個消息部分都是獨立的zmq_msg_t。 ØMQ確保消息的原子交付:同伴應接收消息的所有消息部分或根本不接收消息。除可用內存以外,消息部分的總數不受限制。

多部分消息實際上是原子消息,但分成幾個邏輯消息。即你收到所有零件或沒有零件。如果您無法修改原始郵件,則可以在發件人的IP地址前添加郵件(位於發件人一方)。然後,接收者可以將第一部分作爲發送者IP,將第二部分作爲原始未修改的消息來提取。它將作爲一條消息被傳遞,但在邏輯上被分成兩個謹慎的部分。

在你的情況,你可以做這樣的事情:

// Send a multi-part message consisting of sender IP plus another message 
zmq_msg_send (&my_ip, my_socket, ZMQ_SNDMORE); 
zmq_msg_send (&my_message, my_socket, 0); 

對於接收器,看到的文檔zmq_msg_recv()

+0

如何在本地確定ZMQ用來發送消息的IP地址? – xSNRG

+0

那麼,你通常將套接字綁定到你選擇的端點。該端點(ip +端口)是zmq用來發送消息的內容。 –

相關問題