From owner-freebsd-net@FreeBSD.ORG Thu Mar 18 04:36:13 2004 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id E449A16A4CE for ; Thu, 18 Mar 2004 04:36:12 -0800 (PST) Received: from hotmail.com (bay16-f67.bay16.hotmail.com [65.54.186.117]) by mx1.FreeBSD.org (Postfix) with ESMTP id D875243D2D for ; Thu, 18 Mar 2004 04:36:12 -0800 (PST) (envelope-from fuhuayin@hotmail.com) Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Thu, 18 Mar 2004 04:36:12 -0800 Received: from 193.190.247.45 by by16fd.bay16.hotmail.msn.com with HTTP; Thu, 18 Mar 2004 12:36:12 GMT X-Originating-IP: [193.190.247.45] X-Originating-Email: [fuhuayin@hotmail.com] X-Sender: fuhuayin@hotmail.com From: "Fuhua Yin" To: freebsd-net@freebsd.org Date: Thu, 18 Mar 2004 13:36:12 +0100 Mime-Version: 1.0 Content-Type: text/plain; format=flowed Message-ID: X-OriginalArrivalTime: 18 Mar 2004 12:36:12.0841 (UTC) FILETIME=[9912D990:01C40CE5] cc: yin@helios.iihe.ac.be Subject: Multicast IPv6, socket, X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 18 Mar 2004 12:36:13 -0000 Dear , I am trying to work on IPv6 multicast. I just wrote a small programme to test but get stuck somewhere. I wonder if someone could be of help. Many thanks in advance!! fuhua This is a client to send data from keyboard to group ff3e::2222/1234. ------- #include #include #include #include #include int main(int argc, char **argv){ int mysock; struct sockaddr_in6 servaddr6, cliaddr6; struct ipv6_mreq mreq6; int loop=0; int hops=127; int ifindex; int servlen; int n; char sendline[1024], recvline[1025]; mysock=socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); ifindex=if_nametoindex("eth0"); bzero(&servaddr6, sizeof(servaddr6)); servaddr6.sin6_family=AF_INET6; servaddr6.sin6_port=htons(1234); inet_pton(AF_INET6, "ff3e::2222", &servaddr6.sin6_addr); if(!IN6_IS_ADDR_MULTICAST(&servaddr6.sin6_addr)){ int main(int argc, char **argv){ int mysock; struct sockaddr_in6 servaddr6, cliaddr6; struct ipv6_mreq mreq6; int loop=0; int hops=127; int ifindex; int servlen; int servlen; int n; char sendline[1024], recvline[1025]; mysock=socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); ifindex=if_nametoindex("eth0"); bzero(&servaddr6, sizeof(servaddr6)); servaddr6.sin6_family=AF_INET6; servaddr6.sin6_port=htons(1234); inet_pton(AF_INET6, "ff3e::2222", &servaddr6.sin6_addr); if(!IN6_IS_ADDR_MULTICAST(&servaddr6.sin6_addr)){ printf(" is not multicast ip6 address \n"); exit(1); } bzero(&cliaddr6, sizeof(cliaddr6)); cliaddr6.sin6_family=AF_INET6; cliaddr6.sin6_port=htons(0); inet_pton(AF_INET6, "2001:6a8:1080:102:203:47ff:fe69:ab93", &cliaddr6.sin6_addr); bind(mysock, (struct sockaddr*)& cliaddr6,sizeof(cliaddr6)); setsockopt(mysock, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex,sizeof(ifindex)); setsockopt(mysock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &loop, sizeof(loop)); setsockopt(mysock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)); while (fgets(sendline, 1024,stdin)!=NULL){ sendto(mysock, sendline, strlen(sendline),0, (struct sockaddr*)&servaddr6,sizeof(servaddr6)); printf("fuhua check\n"); fputs(sendline,stdout); } return 0; } ----------------------- This is the server to receive the message and print on screen. -- #include #include #include #include #include #include #include #include #include int main(int argc, char **argv){ int mysock; struct sockaddr_in6 myaddr, cliaddr; char msgbuf[1024]; int clilen; int msglen; mysock=socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); memset(&myaddr,0, sizeof(myaddr)); myaddr.sin6_family=AF_INET6; myaddr.sin6_port=htons(1234); inet_pton(AF_INET6,"2001:6a8:1080:102::d",&myaddr.sin6_addr); printf("ssss \n"); mysock=socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP); bind(mysock, (struct sockaddr*) &myaddr, sizeof(myaddr)); for ( ; ; ) { printf("fuhua yin----ssss \n"); clilen=sizeof(cliaddr); msglen=recvfrom(mysock, msgbuf, 1024, 0, (struct sockaddr*)&cliaddr, &clilen); printf("how many bytes I receive from client %d",msglen); sendto(mysock, msgbuf,msglen, 0, (struct sockaddr*)&cliaddr, clilen); } return 0; _________________________________________________________________