📄 httpt.c
字号:
/* Author:eveson <eveson.hu@gmail.com> website:http://eveson.cublog.cn */ #include "net_wrap.h"#include "parser.h"int main(void){ struct sockaddr_in servaddr,cliaddr; struct sigaction newact_chld,newact_pipe; socklen_t cliaddr_len; int listenfd, connfd; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; int i,n; pid_t pid; int fd; char *key[] = {"ip","port","directory"}; char p[ITEM][255],value[ITEM][255] = {'\0'},type[10],head[255]; struct stat statbuf; if (readconfig("../www/httpt.conf",key,ITEM,value) == -1) /* if config file open failed,exit from program */ perr_exit("../www/httpt.conf"); listenfd = Socket(AF_INET, SOCK_STREAM, 0); newact_chld.sa_handler = sig_child; newact_chld.sa_flags = 0; sigaction(SIGCHLD,&newact_chld,NULL); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(atoi(value[1])); int opt = 1; setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(&opt)); Bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); Listen(listenfd, 20); printf("Accepting connections...\n"); while(1) { cliaddr_len = sizeof(cliaddr); connfd = Accept(listenfd, (struct sockaddr*)&cliaddr, &cliaddr_len); if ((pid = fork()) == 0) /* child process */ { close(listenfd); while (1) /* obtain protocolhead */ { if ((n =Read(connfd, buf, MAXLINE)) == 0) { printf("the client has been closed\n"); break; } if (strstr(buf,"\r\n") != NULL) break; } parser(buf,p); if (strcmp(p[1],"/") == 0) strcat(value[2],"/index.html"); else strcat(value[2],p[1]); printf("Received from %s at PORT %d Request[ %s ]\n",inet_ntop(AF_INET,&cliaddr.sin_addr, str,sizeof(str)),ntohs(cliaddr.sin_port),value[2]); if ((fd = open(value[2],O_RDONLY)) < 0) /* file not exist */ { write(connfd,"HTTP/1.1 404 Not Found\r\n",24); write(connfd,"Content-Type:text/html\r\n",24); write(connfd,"\r\n",2); write(connfd,"<html><body>request file not found</body></html>",48); Close(connfd); exit(0); } else /* file exist */ { fstat(fd,&statbuf); if (statbuf.st_mode & S_IXUSR) /* file can execute */ { write(connfd,"HTTP/1.0 200 OK",17); if (fork() == 0) /* child process create a child process,execute *.sh file */ { dup2(connfd,STDOUT_FILENO); execl(value[2],p[1],NULL); Close(connfd); exit(0); } else { Close(connfd); wait(NULL); exit(0); } } else /* file is not executable */ { if (is_picture(value[2],type) == 1) /* file is a pitcure file */ { write(connfd,"HTTP/1.1 200 OK\r\n",17); strcpy(head,"Content-Type:image/"); strcat(head,type); strcat(head,"\r\n"); write(connfd,head,24); write(connfd,"\r\n",2); while ((n = read(fd,buf,MAXLINE)) > 0) write(connfd,buf,n); Close(connfd); } else /* file is not a picture,deal it as html file type */ { write(connfd,"HTTP/1.1 200 OK\r\n",17); write(connfd,"Content-Type:text/html\r\n",24); write(connfd,"\r\n",2); while ((n = read(fd,buf,MAXLINE)) > 0) write(connfd,buf,n); Close(connfd); } exit(0); } } } else /* parent process */ { close(connfd); } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -