#include "header.h" void process_request(int socketfd, char *buf, size_t size); int main(int argc, char **argv) { int socketfd, acceptfd; struct sockaddr_in server, client; char receive_buf[LINESIZ]; pid_t pid; memset((char *)&server, 0, sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_port = htons(9191); server.sin_addr.s_addr = INADDR_ANY; socketfd = socket_ex(AF_INET, SOCK_STREAM, IPPROTO_TCP); bind_ex(socketfd, (struct sockaddr *)&server, sizeof(server)); listen_ex(socketfd, -1); while(TRUE) { socklen_t clilen = sizeof(client); /* value-result argument */ acceptfd = accept_ex(socketfd, (struct sockaddr *)&client, &clilen); if ((pid = fork()) == 0) { /* read client input and write back to client */ close_ex(socketfd); process_request(acceptfd, receive_buf, LINESIZ); close_ex(acceptfd); exit(0); } else if (pid < 0) { err_fatal("fork() failed in server"); } close_ex(socketfd); } } void process_request(int socketfd, char *buf, size_t size) { char *str_quit = "QUIT"; ssize_t bytesread; while (TRUE) { bytesread = read(socketfd, buf, LINESIZ); if (strstr(buf, str_quit) != NULL) { close_ex(socketfd); exit(0); } if (bytesread < 0 && !(errno == EINTR)) { err_fatal("ERROR: could not read input"); } write_ex(socketfd, buf, bytesread); } }