📄 web_server.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 + -