⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webserver.c

📁 实现了一个简单的web服务器
💻 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 + -