#include #include #include #inclu de #include #include #include
#defineMCAST_PORT8888 #defineMCAST_ADDR"224.0 .0.100" #defineMCAST_INTERVAL5 #defineBUFF_SIZE256
intmain( intargc,charargv[]) { ints;
structsockaddr_inlocal_addr; i nterr=-1;
s=socket(AF_INET,SOCK_DGRAM,0); if (s==-1) { perror("socket()");
return-1;
}
memset(&local_addr,0,sizeof(local_addr)); loca l_addr.sin_family=AF_INET; local_addr.sin_addr.s_addr=ine t_addr("224.0.0.100"); local_addr.sin_port=htons(MCAST_PORT );
intnOptval=1; if(setsockopt(s,SOL_SOCKET,SO_RE USEADDR,(constvoid)&nOptval,sizeof(int))<0) {
perror("reuseAddr:");
return-1; }
err=bind(s,(structsockaddr)&local_addr,sizeof(local_addr)) ; if(err<0) { perror("bind()");
return -2; }
intloop=1; err=setsockopt(s,IPPROTO_IP, IP_MULTICAST_LOOP,&loop,sizeof(loop)); if(err<0) {
perror("setsockopt():IP_MULTICAST_LOOP"); return-3 ;
}
structip_mreqmreq; memset(&mreq,0,siz eof(structip_mreq)); //mreq.imr_multiaddr.s_addr=inet_add r(MCAST_ADDR);
if(inet_aton(MCAST_ADDR,&mreq.imr_mult iaddr)<0) { perror("inet_aton");
return-1; } mreq.imr_interface.s_addr=htonl(INAD DR_ANY);
err=setsockopt(s,SOL_IP,IP_ADD_MEMBERSHIP,& mreq,sizeof(mreq)); if(err<0) {
perror("sets ockopt():IP_ADD_MEMBERSHIP");
return-4;
}
int times=0; socklen_taddr_len=0; charbuff[BUFF_SIZE];
intn=0;
while(1) { addr_len=sizeof(lo cal_addr); memset(buff,0,BUFF_SIZE);
n=recvfrom(s,buff,BUFF_SIZE,0,(structsockaddr)&loc al_addr,&addr_len); if(n==-1) { pe rror("recvfrom()"); }
printf("process%dRecv%d stmessagefromserver:%s\n",getpid(),times,buff);
sl eep(MCAST_INTERVAL);
}
err=setsockopt(s,IPPROTO_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(mreq)); close(s); return0;
} |
|