📄 webserver.c
字号:
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <errno.h>#include "server.h"const unsigned short port = 9000; // Default server port numberchar *error_return = "<HTML>\n<BODY>File not found\n</BODY>\n</HTML>";char ret_buf[TEXT_SIZE];char *read_file(char * filename) { int nread; FILE *fp; if ((fp = fopen(filename, "r")) == NULL) return error_return; nread = fread(ret_buf, 1, TEXT_SIZE, fp); if (nread == 0) { fclose(fp); return error_return; } ret_buf[nread] = '\0'; fclose(fp); return ret_buf;}/* create log file and history file */void create_files() { FILE *log_fp; FILE *hist_fp; log_fp=fopen("led.log","w"); if(log_fp==NULL) { perror("open log file failed\n"); exit(EXIT_FAILURE); } hist_fp=fopen("operation.hist","w"); if(hist_fp==NULL) { perror("open history file failed\n"); exit(EXIT_FAILURE); } fclose(log_fp); fclose(hist_fp);}int main(int argc, char *argv[]) { int serverSocket, connectSocket; int fileSize, totalSent, bytesSent; char recvBuffer[4001]; char *filename; char *content; struct sockaddr_in serverAddr; struct sockaddr_in clientAddr; HTTP_REQ http_req; int nread; void *shared_memory_log=(void *)0; int shmid_log; int *log_writing; void *shared_memory_hist=(void *)0; int shmid_hist; int *hist_writing; /* 初始化共享内存 -- for_log */ shmid_log=shmget((key_t)1234,sizeof(int),0666 | IPC_CREAT); if(shmid_log==-1) { perror("shmget failed\n"); exit(EXIT_FAILURE); } shared_memory_log=shmat(shmid_log,(void *)0,0); if(shared_memory_log==(void *)-1) { perror("shmat failed\n"); exit(EXIT_FAILURE); } log_writing=(int *)shared_memory_log; *log_writing=0; if(shmdt(shared_memory_log)==-1) { fprintf(stderr,"shmdt falied\n"); exit(EXIT_FAILURE); } /* 初始化共享内存 -- for_hist */ shmid_hist=shmget((key_t)1235,sizeof(int),0666 | IPC_CREAT); if(shmid_hist==-1) { perror("shmget failed\n"); exit(EXIT_FAILURE); } shared_memory_hist=shmat(shmid_hist,(void *)0,0); if(shared_memory_hist==(void *)-1) { perror("shmat failed\n"); exit(EXIT_FAILURE); } hist_writing=(int *)shared_memory_hist; *hist_writing=0; if(shmdt(shared_memory_hist)==-1) { fprintf(stderr,"shmdt falied\n"); exit(EXIT_FAILURE); } /* 创建记录文件 */ create_files(); if ((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) == -1){ printf("Invalid socket\n"); exit(1); } serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); memset(&(serverAddr.sin_zero), 0, 8); printf("Binding server socket to port %d\n", port); if (bind(serverSocket, (struct sockaddr*) &serverAddr, sizeof(struct sockaddr)) == -1) { printf("Bad bind\n"); exit(1); } listen(serverSocket, 10); // allow 10 queued requests printf("Accepting connections ...\n"); while (1) { socklen_t clientAddrSize = sizeof(struct sockaddr_in); if ((connectSocket = accept(serverSocket, (struct sockaddr*) &clientAddr, &clientAddrSize)) == -1) { printf("Bad accept\n"); exit(1); } printf("accept.\n"); if ((nread = recv(connectSocket, recvBuffer, 4000, 0)) == -1) break; if (recvBuffer[nread - 1] != '\n') break; recvBuffer[nread] = '\0'; if (DEBUG) { printf("Received from client: %s\n", recvBuffer); } parse(recvBuffer,&http_req);//转换为HTTP_REQ结构 if(strcmp(http_req.req_type,"do")!=0) {//直接返回htm页面 filename=strcat(http_req.req_url,"."); filename=strcat(filename,http_req.req_type); content=read_file(filename); fileSize = strlen(content); totalSent = 0; do { if ((bytesSent = send(connectSocket, content+totalSent, strlen(content+totalSent), 0)) == -1) break; totalSent += bytesSent; } while (totalSent < fileSize); if (DEBUG) printf("Connection closed by client.\n"); close(connectSocket); } else {//执行某些命令 if(fork()==0) {printf("here\n"); doAction(&http_req,connectSocket); if (DEBUG) printf("Connection closed by client.\n"); close(connectSocket); exit(EXIT_SUCCESS); } else { if (DEBUG) printf("Connection closed by client. father\n"); close(connectSocket); } } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -