2013-09-25 38 views
2

我在使用ZeroMQ和IPv6時遇到了麻煩。當我通過IPv4使用連接或者使用「tcp:// [:: 1]:5558」時,它會像魅力一樣連接。但是,如果我使用服務器完整的IPv6地址(在本地主機或遠程主機上)連接,但不在另一端點上獲取數據。ZeroMQ不能在單播IPv6上工作

這裏是我的代碼示例:

client.cpp

#include <stdio.h> 

#include <zmq.h> 

int main(int argc, char** argv) 
{ 
    void* context = zmq_ctx_new(); 
    void* socket = zmq_socket(context, ZMQ_SUB); 
    int ipv6 = 1; 
    zmq_setsockopt(socket, ZMQ_IPV6, &ipv6, 4); 
    zmq_connect(socket, "tcp://[fe80::52e5:49ff:fef8:dbc6]:5558"); 
    //zmq_connect(socket, "tcp://[::1]:5558"); 
    zmq_setsockopt(socket, ZMQ_SUBSCRIBE, "pub", 3); 

    zmq_msg_t message; 
    do { 
     zmq_msg_init (&message); 
     zmq_msg_recv (&message, socket, 0); 
     printf("%s\n", (char*)zmq_msg_data(&message)); 
     zmq_msg_close(&message); 
    } while (zmq_msg_more(&message)); 
} 

而且 server.cpp

#include <string.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

#include <zmq.h> 

int main(int argc, char**argv) 
{ 
    void* context = zmq_ctx_new(); 
    void* publisher = zmq_socket(context, ZMQ_PUB); 
    int ipv6 = 1; 
    zmq_setsockopt(publisher, ZMQ_IPV6, &ipv6, sizeof(int)); 

    zmq_bind(publisher, "tcp://*:5558"); 

    char buffer[4] = "pub"; 
    unsigned tries = 0; 

    while(tries < 10) { 
     zmq_send(publisher, &buffer, strlen(buffer), 0); 
     tries++; 
     sleep(1); 
    } 

    return 0; 
} 

我使用ZeroMQ 4.0.0 RC,但它也在3.2上發生。我在Linux上(slackware)並從源代碼安裝它。我還測試了使用jeroMQ的java服務器,問題是一樣的。我使用REQ-REP連接做了另一個測試,問題是一樣的。

在此先感謝您的幫助。

+0

在這一點上,你可能需要做一些調試。您可以使用tcpdump來確定數據包是否正在發送(並在另一端接收),另外,您可以查看「ss -tpan」的輸出以查看服務器連接上是否有任何傳入數據包。最後,我建議調查一下「netstat -s -p tcp」,看看是否可以發現使用TCP統計信息的任何錯誤 –

回答

4

fe80*地址是鏈接本地的,您必須指定本地主機鏈接名稱:例如fe80...:1%eth1

FE80 ::/10 - 解決鏈路本地前綴僅適用和 唯一一個鏈接。在這個前綴中,只有一個子網被分配了 (54個零比特),產生fe80 ::/64的有效格式。 通常選擇最不重要的64位作爲以修改的EUI-64格式構建的接口硬件地址。在每個啓用IPv6的接口上都需要鏈路本地 地址 - 換句話說,當沒有IPv6路由時,應用程序可能依賴於鏈路本地地址,即使是 。這些地址與IPv4的 自動配置地址169.254.0.0/16相當。

http://en.wikipedia.org/wiki/IPv6_address#Local_addresses

+0

非常感謝!我是一個非常棒的IPv6解決方案,它解決了我的問題! – ofrankmartin