/** * An modified example of server using TCP protocol. * Updated for datagram sockets by Dr. Spiegel * * The program handles data as it comes. * It doesn't fork a process for each cli program. * It reads one message from a socket which is not connected * with the cli program. It prints out the message on the stderr, */ #include #include #include #include #include #include "message.h" #define SERV_HOST_ADDR "156.12.127.18" /* acad's Internet address, defined in /etc/hosts */ main(argc, argv) int argc; char *argv[]; { int sockfd, newsockfd, clilen, pid, err; struct sockaddr_in cli_addr, serv_addr; int SERV_TCP_PORT; char *pname; MES message, tmp; /* SERV_TCP_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_TCP_PORT); if(SERV_TCP_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 stream 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_TCP_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) { if((err = read(sockfd, &tmp, sizeof(MES))) == -1) { 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); } }