


#include "server.h"void mywait(int signm)
{while(1){waitpid(-1,NULL,WNOHANG);}
}int main(int argc, const char *argv[])
{signal(SIGCHLD,mywait);int myport=80;if(argc>1){myport=atoi(argv[1]);}//服务器套接字初始化函数int sfd=serverSocket(myport);struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){//等待连接int nwe_sfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(nwe_sfd==-1);{ERROR_MSG("accept error:");}pid_t pid=fork();if(pid>0){close(nwe_sfd);}else if (pid==0){char buf[1024]="";int len=getLine(nwe_sfd,buf);int k=0,i;char ask[32]="";for(i=0;i<len;i++){if(isspace(buf[i])){break;}ask[k++]=buf[i]; } ask[k]='\0';while(isspace(buf[i]) && i<1023){ i++;}if(strcasecmp(ask,"GET")!=0 && strcasecmp(ask,"POST")!=0){printf("ask error");close(nwe_sfd);exit(EXIT_FAILURE);}if(strcasecmp(ask,"GET")==0){/*GET请求处理*/int k=0;char path[128]="";for(i;i<len;i++){if(isspace(buf[i])){break;}path[k++]=buf[i]; } path[k]='\0';while(isspace(buf[i]) && i<1023){ i++;}if (strcmp(path, "/") == 0) {strcpy(path, "www/index.html"); // 默认首页} else {snprintf(path, sizeof(path), "www%s", path); // 拼接路径}// 返回文件或错误FILE* file = fopen(path, "rb");if (!file) {send_error(nwe_sfd, 404, "Not Found"); // 文件不存在[1](@ref)return -1;}//发送文件内容fseek(file, 0, SEEK_END);long size = ftell(file);rewind(file);char header[512];snprintf(header, sizeof(header), // 构造响应头"HTTP/1.1 200 OK\r\n""Content-Type: %s\r\n""Content-Length: %ld\r\n\r\n",get_mime_type(path), size); send(nwe_sfd, header, strlen(header), 0);//零拷贝发送文件内容(高效)int fd = fileno(file);sendfile(nwe_sfd, fd, NULL, size); fclose(file);}if(strcasecmp(ask,"POST")==0){/*POST请求处理*/}close(nwe_sfd);exit(EXIT_FAILURE);}}return 0;
}