📄 https.c
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<fcntl.h>#include<sys/socket.h>#include<sys/types.h>#include<sys/stat.h>#include<netinet/in.h>#define MAXLINE 4096#define SERV_PORT Portint GetPrmtr(char ** pa){ FILE *fp = fopen("./myhttpd.conf","r"); char buf[50], *ch_p, *delim = "=\n"; int port , line = 0; while((fgets(buf, 50, fp) != NULL)){ line++; if (line == 1){ ch_p = strtok(buf,delim); ch_p = strtok(NULL,delim); port = atoi(ch_p); } else if (line == 2){ ch_p = strtok(buf,delim); ch_p = strtok(NULL,delim); *pa = (char *) malloc(strlen(ch_p)+1); strcpy(*pa, ch_p); } else break; } return port;}Response(int client_fd, char * path){ struct stat file_info; char filepath[1024]; char buf_wr[MAXLINE],*p; int fd, file_len; stat(path,&file_info); if (S_ISREG(file_info.st_mode)) { fd = open(path, O_RDONLY); file_len = lseek(fd, 0, SEEK_END); p = (char *) malloc(file_len + 1); bzero(p, file_len + 1); lseek(fd, 0, SEEK_SET); read(fd, p, file_len); close(fd); strcpy(buf_wr,"HTTP/1.1 200 OK\r\nContent-Type: image/jpg\r\n\r\n"); write(client_fd,buf_wr,strlen(buf_wr)); write(client_fd,p,file_len); puts("done"); free(p); }}int main(void){ struct sockaddr_in servaddr,cliaddr; socklen_t cliaddr_len; int listenfd,connfd; char buf[MAXLINE],buf_wr[MAXLINE], *Path, *ch_pointer; char str[INET_ADDRSTRLEN],*delim = " ",filename[1024],*buf_wr_p; int i,n,Port; pid_t pid0,pid1; FILE *fp; Port = GetPrmtr(&Path); printf("%d,%s",Port,Path); listenfd = socket(AF_INET,SOCK_STREAM,0); bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); 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); pid0 = fork(); if(pid0 == -1){perror("call to fork"); exit(1);} else if(pid0 == 0){ pid1 = fork(); if (pid1 == 0){ close(listenfd) ; while(1){ n = read(connfd,buf,MAXLINE); if(n == 0){ printf("the other side has been closed.\n"); break; } printf("received from %s at PORT %d\n", inet_ntop(AF_INET,&cliaddr.sin_addr, str,sizeof(str)), ntohs(cliaddr.sin_port)); ch_pointer = strtok(buf,delim); ch_pointer = strtok(NULL,delim); if (strlen(ch_pointer) == 1){ /*root directory*/ strcpy(buf_wr, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); write(connfd,buf_wr,strlen(buf_wr)); strcpy(filename,Path); strcat(filename,"index.html"); fp = fopen(filename,"r"); while(fgets(buf_wr,MAXLINE,fp) != NULL){ buf_wr_p = buf_wr; while(*buf_wr_p!= '\n' && *buf_wr_p != '\0') buf_wr_p++; *buf_wr_p = '\r'; buf_wr_p++; *buf_wr_p = '\n'; buf_wr_p++; *buf_wr_p ='\0'; printf("%s\n",buf_wr); write(connfd,buf_wr,strlen(buf_wr)); } fclose(fp); //write(connfd,"\r\n",2); } else{ strcpy(filename,Path); strcat(filename,ch_pointer); Response(connfd,filename); printf("%s\n",filename); } } close(connfd); exit(0); } else{ close(connfd); close(listenfd); exit(1); } } else{ wait(NULL); close(connfd); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -