我遇到了ZeroMQ和IPv6的问题。当我通过IPv4使用连接或使用“tcp:// [:: 1]:5558”时,它会像魅力一样连接。但是,如果我使用服务器的完整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 :(得分:4)
fe80*
地址是本地链接,您必须指定本地主机链接名称:例如fe80...:1%eth1
fe80 :: / 10 - 链接本地前缀中的地址仅有效且 在单个链接上是唯一的。在此前缀中只有一个子网 已分配(54个零位),产生fe80 :: / 64的有效格式。 通常选择最低64位作为接口 以修改的EUI-64格式构建的硬件地址。链接本地 每个启用IPv6的接口都需要地址 - 换句话说, 应用程序甚至可能依赖于链接本地地址的存在 什么时候没有IPv6路由。这些地址可与之相媲美 自动配置地址为IPv4的169.254.0.0/16。