【问题标题】:ZeroMQ is not working over unicast IPv6ZeroMQ 不能在单播 IPv6 上工作
【发布时间】:2013-10-01 11:38:56
【问题描述】:

我在使用 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 连接做了另一个测试,问题是一样的。

提前感谢您的帮助。

【问题讨论】:

  • 此时,您可能需要进行一些调试。您可以使用 tcpdump 来确定是否正在发送数据包(以及是否在另一端接收)。此外,您可以查看“ss -tpan”的输出以查看服务器连接上是否有任何传入数据包。最后,我建议调查“netstat -s -p tcp”,看看是否可以使用 TCP 统计信息发现任何错误。

标签: c++ sockets ipv6 zeromq


【解决方案1】:

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

【讨论】:

  • 非常感谢!我是 IPv6 的一个该死的菜鸟。它解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多