【问题标题】:How to join ipv6 multicast group using libcoap?如何使用 libcoap 加入 ipv6 多播组?
【发布时间】:2018-03-06 06:02:50
【问题描述】:

我是 ipv6 和 libcoap 的新手。我正在使用libcoap 中提供的“coap-server”示例来测试我的 coap 客户端。我无法让 coap-server 监听多播以正常工作。我尝试了以下命令

./coap-server -g FF02::FD
# return "join: setsockopt: Protocol error"

# this method is found in https://manpages.debian.org/stretch/libcoap-1-0-bin/coap-server.5.en.html
./coap-server -g FF02:FD
# return "join: cannot resolve multicast address: Name or service not known"

谁能帮我解决这个问题?谢谢。

【问题讨论】:

  • FF02:FD 不是有效的 IPv6 地址。
  • 这是一个多播地址 - 请参阅规范:“所有 CoAP 节点”地址 FF0X::FD,来自“IPv6 多播地址空间注册表”,在“可变范围多播地址”空间(RFC 3307)。请注意,感兴趣的 CoAP 节点应该监听的每个范围都有一个不同的多播地址; CoAP 只需要 Link-Local 和 Site-Local 范围

标签: ipv6 iot multicast coap


【解决方案1】:

查看Linux source code,文件source/net/ipv6/ipv6_sockglue.c,这个检查决定是否返回“协议错误”错误码:

    retv = -EPROTO;
    if (inet_sk(sk)->is_icsk)
        break;

因此,如果套接字是面向连接的(例如 TCP 套接字),代码将返回错误。

看起来 libcoap 为两个地址系列(IPv4 和 IPv6)、UDP 和 TCP 以及它们的安全版本(分别为 DTLS 和 TLS)打开了套接字。

因此,您可能需要更改示例以迭代所有打开的 CoAP 端点并找到 IPv6 UDP 端点(我没有看到任何命令行选项。因此,不要像当前那样使用第一个这里:

setsockopt(ctx->endpoint->sock.fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mreq, sizeof(mreq));

你应该迭代所有打开的并检查proto字段和地址族是否匹配

coap_endpoint_t *ep = ctx->endpoint;
while (ep != NULL && ep->proto != COAP_PROTO_UDP
       && /* TODO: check address family */) {
    ep = ep->next;
}

if (ep != NULL) {
    result = setsockopt(ep->sock.fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mreq, sizeof(mreq));
}

【讨论】:

  • 如果理解正确,你是说这是 libcoap 示例应用程序中的一个错误,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 2013-12-02
相关资源
最近更新 更多