/* * Example of server using TCP protocol. * Adapted from W.R. Stevens, "Unix Network Programming" */ #include #include #include #include #include #include #include // bzero #include // exit #include // close #include // uint8_t #define SERV_TCP_PORT 5051 #define SERV_HOST_ADDR "127.0.0.1" void err_dump(char *); void process_request(int sockfd); int main(int argc, char *argv[]) { int sockfd, newsockfd, clilen, childpid; struct sockaddr_in cli_addr, serv_addr; /* * Open a TCP socket (an Internet stream socket). */ if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) err_dump("server: can't open stream socket"); int optval = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(int)); /* * Bind our local address so that the client can send to us. */ bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR); // htonl(INADDR_ANY); serv_addr.sin_port = htons(SERV_TCP_PORT); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) err_dump("server: can't bind local address"); listen(sockfd, 5); for ( ; ; ) { /* * Wait for a connection from a client process. * This is an example of a concurrent server. */ clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) err_dump("server: accept error"); if ( (childpid = fork()) < 0) err_dump("server: fork error"); if (childpid == 0) { /* child process */ //close(sockfd); /* close original socket */ puts("In child, calling process_request"); process_request(newsockfd); /* process the request, loops until peer closes connection */ exit(0); } close(newsockfd); /* parent process */ } } #define MAXLINE 250 void process_request(int sockfd) { int n; char line[MAXLINE]; for ( ; ; ) { n = read(sockfd, line, MAXLINE); printf("read %d chars\n", n); if (n == 0) return; /* connection terminated */ else if (n < 0) err_dump("process_request: read error"); if (write(sockfd, line, n) != n){ err_dump("process_request: write error"); } } } void err_dump(char *msg) { perror(msg); exit(1); }