/* receiver for internet datagram demo */ /* modification 9/20/93 with Louis Sanchez's bug fix */ #include #include #include #include #include #include #define ENDPACKET "end" struct Message_header { char sender[10]; /* sender login */ int sessionID; /* starting from 1 */ }; struct Pen_Message { struct Message_header header; unsigned char msg_type; unsigned char size; short x; short y; } pen; /************************************************************ 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((const char *)&(arg->sin_addr), sizeof(arg->sin_addr), AF_INET); printf("Hostname=%s, ", hp->h_name); printf("Port=%d, ", ntohs(arg->sin_port)); printf("Address=%s,\n", inet_ntoa(arg->sin_addr)); } help_msg() { printf("format: idgr\n"); } main(argc, argv) int argc; char *argv[]; { int sock; struct sockaddr_in from; int n, i; char toBuf[2048]; char fromBuf[2048]; int length; int flag = 1; /* create socket */ 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. < 2048 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 (flag) { n = recvfrom(sock, &pen, sizeof(pen), 0, &from, &length); printf("sizeof(pen)=%d\n", sizeof(pen)); if (n < 0) perror("receiving datagram message"); printf("The no. of bytes received=%d\n", n); /* receive pen message */ printf("receive pen message:\n"); printf("\t pen.header.sender = %s\n", pen.header.sender); printf("\t pen.header.sessionID = %d\n", pen.header.sessionID); printf("\t pen.msg_type = %d\n", pen.msg_type); printf("\t pen.size = %d\n", pen.size); printf("\t pen.x = %d\n", pen.x); printf("\t pen.y = %d\n", pen.y); } close(sock); }