#include #include #include #include #include #include #include #include #define PORTNUM 8080 #define BACKLOG 5 #define BUFLEN 80 #define FNFSTR "404 Error File Not Found " #define BRSTR "Bad Request " int main(int argc, char *argv[]) { struct sockaddr_in own_addr, party_addr; int sockfd, newsockfd, filefd; int party_len; char buf[BUFLEN]; int len; int i; /* create socket */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("can't create socket\n"); return 0; } /* bind socket */ memset(&own_addr, 0, sizeof(own_addr)); own_addr.sin_family = AF_INET; own_addr.sin_addr.s_addr = INADDR_ANY; own_addr.sin_port = htons(PORTNUM); if (bind(sockfd, (struct sockaddr *) &own_addr, sizeof(own_addr)) < 0) { printf("can't bind socket!"); return 0; } /* start processing requests for connection */ if (listen(sockfd, BACKLOG) < 0) { printf("can't listen socket!"); return 0; } while (1) { memset(&party_addr, 0, sizeof(party_addr)); party_len = sizeof(party_addr); /* create connection */ if ((newsockfd = accept(sockfd, (struct sockaddr *) &party_addr, &party_len)) < 0) { printf("error accepting connection!"); return 0; } if (!fork()) { /* child is responsible for that connection */ close(sockfd); /* it does not need original socket */ while (1) { if ((len = recv(newsockfd, buf, BUFLEN, 0)) < 0) { printf("error reading socket!"); return 0; } if (len < BUFLEN) { buf[len] = 0; } /* look at the request */ printf("received: %s \n", buf); if (!strcmp(buf, "quit")) { break; } if (send(newsockfd, buf, len, 0) < 0) { printf("error writing socket!"); return 0; } } shutdown(newsockfd, 1); close(newsockfd); return 0; } /* if (!fork()) */ /* father closes new socket and continues to listen on oringinal socket */ close(newsockfd); } /* while */ }