5617l1 Listing 1. udprcv #include #include #include #include #include #include #include #include #include int main() { int sd, saddr_len, n; int uno=1; struct sockaddr_in addr, saddr; char buffer[1000]; struct sock_filter BPF_code[]= { /* Get first two bytes of packet payload * (skipping 8 bytes of UDP header data) */ { 0x28, 0, 0, 0x00000008 }, /* Compare them with 'lj' */ { 0x15, 0, 1, 0x00006c6a }, /* Accept packet if match */ { 0x06, 0, 0, 0x100 }, /* Reject packet otherwise */ { 0x06, 0, 0, 0x00 } }; struct sock_fprog Filter; Filter.len = 4; Filter.filter = BPF_code; bzero(&addr, sizeof(struct sockaddr_in)); bzero(&saddr, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(6600); addr.sin_addr.s_addr = INADDR_ANY; sd = socket(PF_INET, SOCK_DGRAM, 0); if (sd==-1) { perror("socket"); exit(0); } setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &uno, sizeof(uno)); if ((setsockopt(sd, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(Filter)))==-1) { printf("errno = %d\n", errno); perror("setsockopt()"); close(sd); exit(1); } bind(sd, (struct sockaddr *)&addr, sizeof(addr)); saddr_len = sizeof(saddr); while (n=recvfrom(sd, buffer, 1000, 0, (struct sockaddr*)&saddr, &saddr_len)) { if (n==-1) { perror("recvfrom"); close(sd); exit(0); } buffer[n]=0; printf("Received from %s (ports %d,%d) %d bytes\n" "Data: <%s>\n", inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port), ntohs(addr.sin_port), n, buffer); } close(sd); }