linux 组播搜寻ip,IPv6的组播侦听在Linux上

我试图得到一个简单的例子多播在Linux上工作(我 尝试都RHEL 4 2.6.9和Ubuntu 8.04 2.6.24)。总的想法是 ,我希望服务器绑定到单播地址,然后将 本身添加到组ff02 :: 1。然后我想它会收到发送到ff02 :: 1的多播组件 。下面的代码适用于Mac OS X 10.5(在 事实上,在OS X上运行的服务器从Linux 客户端获取多播),但我无法让Linux服务器端正常工作。它不会 获得任何多点传送。如果我将代码绑定到::(INADDR6_ANY) 而不是单播地址(我已经尝试链接本地和全局 地址),它确实获取多播。我想知道是否有人可以指出我做错了什么。IPv6的组播侦听在Linux上

服务器:

memset(&hint, 0, sizeof(hint));

hint.ai_family = AF_INET6;

hint.ai_socktype = SOCK_DGRAM;

// argv[1] is either a link-local or a global address

err = getaddrinfo(argv[1], NULL, &hint, &info);

if(err != 0) {

perror("getaddrinfo");

exit(1);

}

struct sockaddr_in6 * addr = (struct sockaddr_in6*)info->ai_addr;

//addr->sin6_addr = in6addr_any; // if this is uncommented, multicasts are received

addr->sin6_port = htons(7890);

s = socket(AF_INET6, SOCK_DGRAM, 0);

if(bind(s, (struct sockaddr*) addr, info->ai_addrlen) != 0) {

close(s);

perror("bind");

exit(1);

}

if(getaddrinfo("ff02::1", NULL, &hint, &multi) != 0) {

close(s);

perror("getaddrinfo");

exit(1);

}

struct ipv6_mreq mreq;

memset(&mreq, 0, sizeof(mreq));

memcpy(&mreq.ipv6mr_multiaddr, &((struct sockaddr_in6 *) multi->ai_addr)->sin6_addr, sizeof(mreq.ipv6mr_multiaddr));

mreq.ipv6mr_interface = 2; // 2 happens to be the interface ID; I've tried other values here

freeaddrinfo(multi);

if(setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) != 0) {

close(s);

perror("IPV6_JOIN_GROUP");

exit(1);

}

for(; ;) {

char data[6];

size_t len;

len = recvfrom(s, data, 5, 0, NULL, NULL);

data[5] = '\0';

printf("Received %s\n", data);

if(strcmp(data, "exitt") == 0) {

break;

}

}

客户端代码如下:

memset(&hint, 0, sizeof(hint));

hint.ai_family = AF_INET6;

hint.ai_socktype = SOCK_DGRAM;

hint.ai_protocol = 0;

err = getaddrinfo("ff02::1", NULL, &hint, &info);

if(err != 0) {

perror("getaddrinfo");

return 0;

}

struct sockaddr_in6 * addr = (struct sockaddr_in6*)info->ai_addr;

addr->sin6_port = htons(7890);

addr->sin6_scope_id = 2; // 2 happens to be the interface ID

s = socket(AF_INET6, SOCK_DGRAM, 0);

for(; ;) {

char data[6];

size_t len;

scanf("%5s", data);

data[5] = '\0';

printf("Sending %s\n", data);

if(sendto(s, data, 5, 0, info->ai_addr, info->ai_addrlen) != 5) {

printf("Error sending\n");

}

if(strcmp(data, "exitt") == 0) {

break;

}

}

close(s);

2010-10-03

Ray

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值