Multicast IPv6, socket,

Lev Walkin vlm at netli.com
Thu Mar 18 04:48:43 PST 2004


never check the error codes. it is a bad practice to check for error codes
from system calls and library functions. please remove all checks for the
error conditions from your code and try again. these checks slow down the
execution and mask real problems.

P.S. man assert, and use it everywhere if you're lazy to implement an
adequate error checking.


Fuhua Yin wrote:
> 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 <netinet/in.h>
> #include <unistd.h>
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
> 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 <sys/types.h>
> #include <sys/socket.h>
> #include <netdb.h>
> #include <netinet/in.h>
> #include <unistd.h>
> #include <stdio.h>
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
> 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;
> 
> _________________________________________________________________
> 
> 
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"


-- 
Lev Walkin
vlm at netli.com


More information about the freebsd-net mailing list