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

时间:2018-03-06 06:02:50

标签: ipv6 iot multicast coap

我是ipv6和libcoap的新手。我正在使用" coap-server" libcoap中提供的示例用于测试我的coap客户端。我不能让coap-server持续到多播才能正常工作。我已经尝试了以下命令

add_action( 'woocommerce_checkout_update_order_meta', 'woocommerce_checkout_update_order_meta' );
function woocommerce_checkout_update_order_meta( $order_id ) {
  $order = wc_get_order( $order_id );
  $address = $order->get_billing_address_1();
  update_post_meta( $order_id, '_alternative_paypal_email', $email );
}
add_filter( 'woocommerce_paypal_args', 'woocommerce_paypal_args', 10, 2 );
function woocommerce_paypal_args( $paypal_args, $order ) {
  $email = get_post_meta( $order->get_id(), '_alternative_paypal_email', true );
  if ( !empty( $email ) ) {
    $paypal_args['business'] = $email;
  }
  return $paypal_args;
}

任何人都可以帮我吗?感谢。

1 个答案:

答案 0 :(得分: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));
}