/* * listener.c -- joins a multicast group and echoes all data it receives from * the group to its stdout... * * Antony Courtney, 25/11/94 * Modified by: Frédéric Bastien (25/03/04) * to compile without warning and work correctly */ #include #include #include #include #include #include #include #define HELLO_PORT 47391 #define HELLO_GROUP "239.255.171.51" #define MSGBUFSIZE 256 #define MYNICA "10.5.5.251" main(int argc, char *argv[]) { struct sockaddr_in addr; int fd, nbytes,addrlen,ctr; struct ip_mreq mreq; char msgbuf[MSGBUFSIZE]; int d,m=0,pos; unsigned vv,ref=0,pt=0,delta,frqno=0; signed sum; u_int yes=1; /*** MODIFICATION TO ORIGINAL */ /* create what looks like an ordinary UDP socket */ if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) { perror("socket"); return(1); } /**** MODIFICATION TO ORIGINAL */ /* allow multiple sockets to use the same PORT number */ if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) { perror("Reusing ADDR failed"); return(1); } /*** END OF MODIFICATION TO ORIGINAL */ /* set up destination address */ memset(&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */ addr.sin_port=htons(HELLO_PORT); /* bind to receive address */ if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) { perror("bind"); return(1); } /* use setsockopt() to request that the kernel join a multicast group */ mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP); mreq.imr_interface.s_addr=inet_addr(MYNICA); if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) { perror("setsockopt"); return(1); } /* now just enter a read-print loop */ while (1) { addrlen=sizeof(addr); if ((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0, (struct sockaddr *) &addr,&addrlen)) < 0) { perror("recvfrom"); return(1); } d=0; if (msgbuf[0]) d|=1; if (msgbuf[5]) d|=2; if (msgbuf[10]) d|=4; if (msgbuf[15]) d|=8; if (msgbuf[20]) d|=16; if (msgbuf[25]) d|=32; if (msgbuf[30]) d|=64; if (msgbuf[35]) d|=128; // printf(":: %x\n",d); restart: switch (m) { case 0: //if (d==0xBE) m=1; break; case 1: if (d==0xBD) {m=2; break;} m=0; break; case 2: if (d==0x14) {m=3; break;} if (d==0x15) {m=20; break;} if (d==0x1F) {m=10; break;} m=0; goto restart; // case 2: if (d==0x14) {m=3; break;} m=0; goto restart; case 3: vv=d; m=4; break; case 4: vv<<=8; vv|=d; m=5; break; case 5: vv<<=8; vv|=d; m=6; break; case 6: vv<<=8; vv|=d; m=0; delta=vv-ref; ref=vv; ++pt; sum+=delta; sum-=20000000-1900; // printf("%u %u\n",pt,delta); printf("pps info n=%u abs=%u delta=%u\n",pt,vv,delta); break; case 10: if (d) printf("%c",d); else m=0; fflush(stdout); break; case 20: vv=d; m=21; break; case 21: vv<<=8; vv|=d; m=22; break; case 22: vv<<=8; vv|=d; m=23; break; case 23: vv<<=8; vv|=d; m=24; //fprintf(stdout,"%u %0.1f ",++frqno,((signed)vv)*0.1); fprintf(stderr,"Frequency error %0.1f ppb, ",((signed)vv)*0.1); break; case 24: vv=d; m=25; break; case 25: vv<<=8; vv|=d; m=0; fprintf(stderr,"dac %u\n",vv); fflush(stdout); } } }