📄 httpserver.c
字号:
#include "httpserver.h"#define Limit 10240#define Maxsize 1024int sd;int child = 0;int port = 80;char *dir;char arg[1024];sigset_t sigset;void sigchld(int x){ signal(SIGCHLD, sigchld); waitpid(-1, NULL, WNOHANG); child--;}void sighup(int x){ close(sd); printf("%s\n", arg); execl(arg, arg, NULL);}void sigalrm(int x){ printf("alarm\n");}int main(int argc, char **argv){ int cd; int file; int pip[2]; int error = 0; int start = 0; int end = 0; int current = 0; int childnum = 1024; char filebuff[Maxsize]; char *p; char *q; char *buff; char filename[1024]; off_t currpos; pid_t pid; fd_set fd; time_t timenow; socklen_t len; struct sockaddr_in client; if(wdaemon(W_NOCHDIR|W_NOCLOSE) < 0) { perror("wdaemon"); exit(-1); } memcpy(arg, argv[0], strlen(argv[0])); if(httplog() < 0) { perror("httplog"); exit(-1); } if((dir = readconf(&port, &childnum)) == NULL) { dir = "/var/www/"; } signal(SIGCHLD, sigchld); signal(SIGHUP, sighup); sigemptyset(&sigset); sigaddset(&sigset, SIGCHLD); if((sd = winetserver(W_TCP, port)) < 0) { exit(-1); } while(1) { len = sizeof(struct sockaddr_in); FD_ZERO(&fd); FD_SET(sd, &fd); if(select(wmax(1, sd) + 1, &fd, NULL, NULL, NULL) < 0) { continue; } if(FD_ISSET(sd, &fd)) { if(pid = waitpid(-1, NULL, WNOHANG) > 1) { child--; } if(child >= childnum) { continue; } if((cd = accept(sd, (struct sockaddr *)&client, &len)) < 0) { continue; } pid = fork(); if(pid > 0) { child++; close(cd); continue; } else if(pid == 0) { close(sd); while(buff = wgets(cd), buff[0] != '\r') { if((p = strstr(buff, "GET /")) != NULL) { q = strstr(buff, "HTTP"); bzero(filebuff, sizeof(filename)); strncpy(filebuff, buff+5, q-p-6); if(filebuff[0] < 2) { strcpy(filebuff, "index.htm"); } sprintf(filename, "%s%s", dir, filebuff); if((file = open(filename, O_RDONLY)) < 0) { sprintf(filename, "%s%s", dir, "404.html"); if((file = open(filename, O_RDONLY)) < 0) { close(cd); exit(-1); } error = 1; } currpos = lseek(file, 0, SEEK_END); } else if((p = strstr(buff, "Range: bytes=")) != NULL) { if((sscanf(buff + 13, "%d-%d", &start, &end)) < 2) { end = currpos - 1; } } else { } } bzero(filebuff, sizeof(filebuff)); if(end != 0) { strcpy(filebuff, "HTTP/1.1 206 Partial Content\r\n"); } else if(error == 1) { strcpy(filebuff, "HTTP/1.1 302 Found\r\n"); } else { strcpy(filebuff, "HTTP/1.1 200 OK\r\n"); } wwrite(cd, filebuff, strlen(filebuff)); timenow = time(NULL); strftime(filebuff, 1024, "Date: %a, %d %b %G %X GMT\r\n", gmtime(&timenow)); wwrite(cd, filebuff, strlen(filebuff)); strcpy(filebuff, "Server: WangAn/1.0\r\n"); wwrite(cd, filebuff, strlen(filebuff)); if(end != 0) { sprintf(filebuff, "Content-Length: %d\r\n", current = end - start + 1); wwrite(cd, filebuff, strlen(filebuff)); sprintf(filebuff, "Content-Range: bytes %d-%d/%d\r\n", start, end, currpos); wwrite(cd, filebuff, strlen(filebuff)); } else { sprintf(filebuff, "Content-Length: %d\r\n", current = currpos); wwrite(cd, filebuff, strlen(filebuff)); } if(error == 1) { sprintf(filebuff, "Location: 404.html\r\n"); wwrite(cd, filebuff, strlen(filebuff)); } strcpy(filebuff, "\r\n"); wwrite(cd, filebuff, strlen(filebuff)); lseek(file, start, SEEK_SET); while(current > sizeof(filebuff)) { bzero(filebuff, sizeof(filebuff)); wread(file, filebuff, sizeof(filebuff)); wwrite(cd, filebuff, sizeof(filebuff)); current = current - (sizeof(filebuff)); usleep((int)(1000000./(float)(Limit/Maxsize))); } bzero(filebuff, sizeof(filebuff)); wread(file, filebuff, current); wwrite(cd, filebuff, current); close(cd); close(file); exit(0); } else if(pid < 0) { continue; } } else { continue; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -