#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <pthread.h>
#include<sys/wait.h>
#include<time.h>
#define PORT 80
#define MAXDATA 40960
static char *msg[] = { "Time flies like an arrow.","Practice makes perfect.","Efforts will always pay off.","Seeing is believing."};
void sig_handler(int signum) {
while (0 < waitpid(-1, NULL, WNOHANG));
}
void *process_thread(void *arg) {
int mid;
int rsize;
int conne_sock;
char buf[MAXDATA];
char webpage[20480];
conne_sock = *(int *)arg;
free(arg);
rsize = recv(conne_sock, buf, MAXDATA, 0);
if (rsize <= 0) {
printf("Connection closed.\n");
return NULL;
}
puts("\n<<<< RECEIVED MESSAGE FROM HERE <<<< ");
puts(buf);
puts(">>>> RECEIVED MESSAGE END HERE >>>>\n");
if(strncmp("GET /", buf, 5) != 0) {
return NULL;
}
srand(time(NULL));
mid = rand() % 4;
strcpy(webpage, "<HTML><BODY><H1>\n");
sprintf(webpage + strlen(webpage),"PPID:%d<BR>\n", getppid());
sprintf(webpage + strlen(webpage),"PID:%d<BR>\n", getpid());
sprintf(webpage + strlen(webpage),"thread:%ld<BR>\n", (long)pthread_self());
strcat(webpage, "<HR>\n");
strcat(webpage, msg[mid]);
strcat(webpage, "</H1></BODY><HTML>\n");
strcpy(buf, "HTML/1.0 200 OK\n");
sprintf(buf + strlen(buf), "Content-Length: %d\n", strlen(webpage));
strcat(buf, "\n");
strcat(buf, webpage);
strcat(buf,"\n");
puts("\n<<<< SEND MESSAGE FROM HERE <<<< ");
puts(buf);
puts(">>>> SEND MESSAGE END HERE >>>>\n");
send(conne_sock, buf, strlen(buf), 0);
close(conne_sock);
return NULL;
}
int main(void) {
signal(SIGCHLD, sig_handler);
struct sockaddr_in my_adr;
struct sockaddr_in clnt_adr;
socklen_t len = sizeof(struct sockaddr_in);
int lis_sock, conne_sock, *p_conne_sock;
pthread_t pt;
lis_sock = socket(AF_INET, SOCK_STREAM, 0);
int opt = 1;
setsockopt(lis_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
bzero((char *)&my_adr, sizeof(my_adr));
my_adr.sin_family = PF_INET;
my_adr.sin_addr.s_addr = INADDR_ANY;
my_adr.sin_port = htons(PORT);
bind(lis_sock, (struct sockaddr *)&my_adr, len);
listen(lis_sock, SOMAXCONN);
printf("PID:%d\nStart Listening Port : %d...\n", getpid(), PORT);
while (1) {
conne_sock = accept(lis_sock, (struct sockaddr *)&clnt_adr, &len);
p_conne_sock = malloc(sizeof(int));
*p_conne_sock = conne_sock;
pthread_create(&pt, NULL, &process_thread, p_conne_sock);
}
return 0;
}
/* end */