首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用libcoap加入ipv6组播组?

如何使用libcoap加入ipv6组播组?
EN

Stack Overflow用户
提问于 2018-03-06 14:02:50
回答 1查看 466关注 0票数 1

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

代码语言:javascript
复制
./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"

有人能帮我吗?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-03-07 05:06:10

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

代码语言:javascript
复制
    retv = -EPROTO;
    if (inet_sk(sk)->is_icsk)
        break;

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

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

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

代码语言:javascript
复制
setsockopt(ctx->endpoint->sock.fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mreq, sizeof(mreq));

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

代码语言:javascript
复制
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));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49124346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档