/* receiver for internet datagram demo */ /* modification 9/20/93 with Louis Sanchez's bug fix */ #include #include #include #include #include /************************************************************ printsockaddr prints the contents of a sockaddr_in structure when called with a pointer to such a structure. ************************************************************/ void printsockaddr(struct sockaddr_in *arg) { struct hostent *hp; printf(" sockaddr_in: "); printf("Domain=%d, ", arg->sin_family); hp=gethostbyaddr(&(arg->sin_addr), sizeof(arg->sin_addr), AF_INET); printf("Hostname=%s, ", hp->h_name); printf("Address=%s,\n", inet_ntoa(arg->sin_addr)); printf("Port=%d, ", ntohs(arg->sin_port)); } help_msg() { printf("format: idgr3 [-dv]\n"); printf(" option: v set verbose mode print rcvd msg\n"); printf(" d set debug mode\n"); } main(argc, argv) int argc; char *argv[]; { int sock; struct sockaddr_in to; struct sockaddr_in from; struct hostent *hp, *gethostbyname(); int msgNo; int n, i; char toBuf[2048]; char fromBuf[2048]; char hostname[64]; extern char *optarg; extern int optind; int option_exist = 0; int c; int debug = 0; int verbose = 0; char rcv_name[64]; /* receiver's socket name */ int toPort_no; int length; int fromlen; /* process command line args */ while ((c=getopt(argc,argv,"dn:")) != EOF) { option_exist = 1; switch(c) { case 'd': debug = 1; printf("turn on debug mode.\n"); break; case 'v': verbose = 1; printf("turn on verbose mode print each rcvd msg.\n"); break; case '?': help_msg(); exit (1); default: fprintf (stderr, "unrecognized arg >%s<\n", optarg); help_msg(); exit (1); } } /* create socket from which to read */ sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("opening datagram socket"); exit(1); } /* create name structure with wildcard using INADDR_ANY */ from.sin_family = AF_INET; from.sin_addr.s_addr = INADDR_ANY; from.sin_port = 0; /* port no. < 1024 IPPORT_RESERVED is for privillege process */ /* here just initialized it, it will be assigned value after call */ /* getsockname() */ if (bind(sock, &from, sizeof(struct sockaddr_in))) { perror("binding name to datagram socket"); exit(1); } length = sizeof(from); if (getsockname(sock, &from, &length)) { perror("getting socket name"); exit(1); } /* Find assigned port value and print out. */ printf("socket has port #%d\n", ntohs(from.sin_port)); /* receive message */ while (1) { length = sizeof(to); n = recvfrom(sock, fromBuf, 2048, 0, &to, &length); if (n < 0) perror("receiving datagram message"); if (debug) printsockaddr(&to); fromBuf[n] = 0; /* null terminate */ sscanf(fromBuf, "packet %d", &msgNo); if (verbose) printf("received %s\n", fromBuf); /* replying with ack message */ sprintf(toBuf, "ACK %d\n", msgNo); if (sendto(sock, toBuf, strlen(toBuf), 0, &to, sizeof(to)) < 0) perror("sending datagram message"); } close(sock); }