【问题标题】:ipv6 multicast receptionipv6 多播接收
【发布时间】:2012-10-26 03:11:39
【问题描述】:

我无法接收服务器发送的多播数据包。我可以看到通过 tcpdump 接收到的数据包。谁能告诉我我在这里做错了什么。谢谢。

struct ipv6_mreq mreq;
struct sockaddr_in6 servaddr;

sock = socket(AF_INET6,SOCK_DGRAM,0);

servaddr.sin6_family = AF_INET6;
servaddr.sin6_port = htons(61624);
servaddr.sin6_addr = in6addr_any;

inet_pton(AF_INET6,"ff38:40:2001::1",&mreq.ipv6mr_multiaddr);

mreq.ipv6mr_interface = 0;
setsockopt(sock,IPPROTO_IPV6,IPV6_JOIN_GROUP, &mreq,sizeof(mreq));
bind(sock,(struct sockaddr *)&servaddr,sizeof(servaddr));
/* using poll to receive data */

【问题讨论】:

  • 您是否在检查任何函数调用的错误返回值?
  • 感谢您的回复。是的,我添加了对 setsockopt 和 bind 的返回值的检查。 setsockopt 返回 -1 。 perror 抛出了无效参数。
  • 现在在更改行之后 mreq.ipv6mr_multiaddr = servaddr.sin6_addr;到 inet_pton(AF_INET6,"ff38:40:2001::1",&mreq.ipv6mr_multiaddr);我没有看到无效的争论错误。但是还是看不到收到的数据包。

标签: c sockets ipv6 multicast multicastsocket


【解决方案1】:

零是 invalid 应该是“嘿内核,为我选择一个”接口索引。这对您不起作用,很可能是因为您的路由表没有与给定多播组匹配的显式条目,并且默认路由通过不同的接口。

使用if_nametoindex(3)解析接口名称并将其存储到struct ipv6_mreq的成员ipv6mr_interface中。

【讨论】:

  • 非常感谢。有效。但是从网上看到,将接口索引设置为零会让内核选择默认接口,是不是?
  • 是的,它通常是这样工作的。检查你的路由表,你可能绑定了错误的接口。
  • 如果你安装了多个网卡,你肯定不应该依赖内核为你选择默认接口。您需要明确说明您有兴趣使用哪个接口。
猜你喜欢
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
相关资源
最近更新 更多