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

📄 web_server.c

📁 模拟http服务器 模拟http协议的一个服务器端 运行之后能用IE连接
💻 C
字号:
//-------------------------------------------------------
// 颇老疙: web_server.c
// 侩档	 : This program is made for HTTP server 
// 哪颇老: make or make all
// 荤侩过: ws_run 8080
//-------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <stdlib.h>
#include "web_server.h"
#include "web_task.h"
int serverSocket, clientSocket;
//-------------------------------------------------------
// read_file 窃荐 
//-------------------------------------------------------
void read_file(st_req* req_data)
{
	int i, j;
	char length[10], temp[4000], url[100];
	FILE *f;

	/* fetch file */
	strcpy(url, HtmlDir); 				//html 颇老捞 乐绰 叼泛配府甫 ulr俊 汗荤
	strcat(url, req_data->url);
	if((f =fopen(url, "r")) == NULL) {	//颇老阑 茫阑 荐 绝阑 版快
		strcpy(url, HtmlDir);
		strcat(url, "FaultPage.html"); 
		f=fopen(url, "r");
	}
	while((i=fread(temp, 1, 4000, f)) !=0)
		write(clientSocket, temp, i);	//努扼捞攫飘俊霸 其捞瘤啊 绝澜阑 烹焊
	fclose(f);
}
//-------------------------------------------------------
// main 窃荐 
//-------------------------------------------------------
int main(int argc, char* argv[])
{
	int i, pair_num, clientAddrSize, size, totalReceived, num;
	st_req *request_data;			//request 皋矫瘤甫 困茄 备炼眉
	unsigned int yes = 1, rc=0;			//家南 犁荤侩 可记阑 瘤沥窍扁 困秦 急攫
	struct sockaddr_in serverAddr, clientAddr;
	char result[8], *port;

	strcpy(HtmlDir, "html/"); 		//html 颇老捞 乐绰 叼泛配府 瘤沥
	if (argc < 2) {
		printf("荤侩过 : ./http [port]\n");
		exit(0);
	}
	/* 辑滚 家南 俺汲 棺 辑滚 林家 技泼 */
	serverSocket = socket(AF_INET, SOCK_STREAM, 0);
	if(serverSocket == -1) {
		printf("Invalid socket\n");
		exit(1);
	}
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons(atoi(argv[1]));
	serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	memset(&(serverAddr.sin_zero), 0, 8);
	
	/* 家南 犁荤侩 可记 瘤沥, 家南 bind 棺 listen  */
	setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
	rc = bind(serverSocket, (struct sockaddr*) &serverAddr, sizeof(struct sockaddr));
	if(rc==-1) {
		printf("Bad bind\n");
		exit(1);
	}
	rc = listen(serverSocket,10);   /* allow 10 queued requests */
	if(rc == -1) {
		printf("Bad listen\n");
		exit(1);
	}
	/* 楷搬 夸没阑 扁促覆 */
	printf("Accepting connections ... \n");
	while(1) 
	{
		clientAddrSize = sizeof(struct sockaddr_in);
		do //努扼捞攫飘 楷搬 夸没 荐遏
			clientSocket = 
				accept(serverSocket, (struct sockaddr*) &clientAddr, &clientAddrSize);
		while((clientSocket == -1) && (errno == EINTR));
		if(clientSocket == -1) {
			printf("Bad accept\n");
			continue;
		}
		
		/* 夸没 皋矫瘤 备炼眉 父怒 皋葛府 且寸 */
		request_data = (st_req*)malloc(sizeof(st_req));
		request_data->client_sd = clientSocket;
		
		i = recv(clientSocket, request_data->msg, 4000, 0);
		if(i==-1) {
			free(request_data);					//荐脚 角菩 矫俊 皋葛府 秦力
			continue;
		}
		request_data->msg[i] = '\0'; 			//皋矫瘤狼 场阑 舅府扁困秦 澄 巩磊 眠啊 
		extractRequest(request_data);			//extractRequest 窃荐 龋免  
		printf("%s\n", request_data->url);	
		
		/* 霉其捞瘤牢瘤 酒囱瘤甫 魄窜窍咯 牢刘 咯何 魄窜 */
		if(strcmp(request_data->url, "") == 0) {
			strcat(request_data->url, "index.html");
			read_file(request_data);			//read_file 窃荐 龋免 
		}
		else if(strcmp(request_data->url, "img/present.gif") == 0) {
			read_file(request_data);
		}
		else {
			checkAuthorize(request_data);
			if(request_data->is_logged!=ANU_TRUE) {
				strcpy(request_data->url, "Authorize.html"); //牢刘 夸没 皋矫瘤甫 焊晨
				read_file(request_data);
			}
			else {	
				if(strcmp(request_data->url, "execute.html") == 0) {
					if(request_data->method == METHOD_POST) {
						pair_num = setRequestPostValue(request_data);
						execute(request_data, pair_num);
					}
					else read_file(request_data);
				}
				else read_file(request_data);
			}
		}

		close(clientSocket);  		//飘罚黎记 窜困肺 贸府窍骨肺 碍力肺 家南阑 摧澜

		if(request_data != NULL)
			free(request_data); 	//皋葛府 秦力
	} //end of while 
	return 0;
}
//------------------- end of file -------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -