/* * An modified example of server using UDP protocol. * (UNIX NETWORK PROGRAMMING, by Richard Stevens, * Prentice Hall, 1990, pp. 284-286) * * It reads one message from a datagram socket sent from the cli program. * It prints out each message received on the stderr * and sends the message back to the cli program using * the port number from the inward socket internet address record. */ #include #include #include #include #include #include "message.h" /*#define SERV_HOST_ADDR "130.108.2.22" gamma's Internet address, defined in /etc/hosts */ // #define SERV_HOST_ADDR "156.12.23.5" #define SERV_HOST_ADDR "156.12.1.120" /* pooh's Internet address, defined in /etc/hosts */ main(argc, argv) int argc; char *argv[]; { int sockfd, newsockfd, clilen, pid, err; struct sockaddr_in serv_addr; struct sockaddr_in cli_addr; int SERV_UDP_PORT; char *pname; MES message, tmp; /* SERV_UDP_PORT is the port number on kiwi used by this server program */ printf("Please input an integer which is larger than 1023.\n"); scanf("%d", &SERV_UDP_PORT); if(SERV_UDP_PORT > 1023) printf("Please run the program cli now.\n"); else { printf("Wrong input.\n"); exit(1); } pname = argv[0]; /* create a socket which is one end of a communication channel */ if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("server: cannot open datagram socket"); exit(1); } /* initialize server address */ bzero((char *) &serv_addr, sizeof(serv_addr)); /* reset */ serv_addr.sin_family = AF_INET; /* address family: Internet */ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* accept a connection on any Internet interface */ serv_addr.sin_port = htons(SERV_UDP_PORT); /* specify port number */ /* associate server address with the socket */ if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("server: cannot bind local address"); exit(2); } while(1) { clilen=sizeof(cli_addr); err=recvfrom(sockfd, &tmp, sizeof(MES),0,(struct sockaddr *)&cli_addr, &clilen); if(err < 0) { perror("server: read"); exit(4); } else if (err == 0) exit(5); message.mtype = ntohl(tmp.mtype); message.number = ntohl(tmp.number); fprintf(stderr, "server output: %d %d\n", message.mtype, message.number); if(sendto(sockfd,&tmp,sizeof(MES),0, (struct sockaddr *)&cli_addr, clilen)==-1) { perror("server: write"); exit(6); } } }