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

📄 httpt.c

📁 小型web服务器
💻 C
字号:
/* Author:eveson <eveson.hu@gmail.com>   website:http://eveson.cublog.cn  */    #include "net_wrap.h"#include "parser.h"int main(void){	struct sockaddr_in servaddr,cliaddr;	struct sigaction newact_chld,newact_pipe;	socklen_t cliaddr_len;	int listenfd, connfd;	char buf[MAXLINE];	char str[INET_ADDRSTRLEN];	int i,n;	pid_t pid;	int fd;	char *key[] = {"ip","port","directory"};	char p[ITEM][255],value[ITEM][255] = {'\0'},type[10],head[255];	struct stat statbuf;	if (readconfig("../www/httpt.conf",key,ITEM,value) == -1)	/* if config file open failed,exit from program */		perr_exit("../www/httpt.conf");	listenfd = Socket(AF_INET, SOCK_STREAM, 0);	newact_chld.sa_handler = sig_child;	newact_chld.sa_flags = 0;	sigaction(SIGCHLD,&newact_chld,NULL);	bzero(&servaddr, sizeof(servaddr));	servaddr.sin_family = AF_INET;	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);	servaddr.sin_port = htons(atoi(value[1]));	int opt = 1;	setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(&opt));	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);		if ((pid = fork()) == 0)	/* child process */		{			close(listenfd);			while (1)			/* obtain protocolhead */			{				if ((n =Read(connfd, buf, MAXLINE)) == 0)				{					printf("the client has been closed\n");					break;				}				if (strstr(buf,"\r\n") != NULL)					break;			}			parser(buf,p);						if (strcmp(p[1],"/") == 0)				strcat(value[2],"/index.html");			else				strcat(value[2],p[1]);			printf("Received from %s at PORT %d Request[ %s ]\n",inet_ntop(AF_INET,&cliaddr.sin_addr,																   str,sizeof(str)),ntohs(cliaddr.sin_port),value[2]);			if ((fd = open(value[2],O_RDONLY)) < 0)		/* file not exist */ 			{				write(connfd,"HTTP/1.1 404 Not Found\r\n",24);				write(connfd,"Content-Type:text/html\r\n",24);				write(connfd,"\r\n",2);				write(connfd,"<html><body>request file not found</body></html>",48);				Close(connfd);				exit(0);			}			else			/* file exist */			{				fstat(fd,&statbuf);				if (statbuf.st_mode & S_IXUSR)		/* file can execute */				{					write(connfd,"HTTP/1.0 200 OK",17);					if (fork() == 0)	/* child process create a child process,execute *.sh file */					{						dup2(connfd,STDOUT_FILENO);						execl(value[2],p[1],NULL);						Close(connfd);						exit(0);					}					else					{						Close(connfd);						wait(NULL);						exit(0);					}				}				else		/* file is not executable */				{					if (is_picture(value[2],type) == 1)		/* file is a pitcure file */					{						write(connfd,"HTTP/1.1 200 OK\r\n",17);						strcpy(head,"Content-Type:image/");						strcat(head,type);						strcat(head,"\r\n");						write(connfd,head,24);						write(connfd,"\r\n",2);						while ((n = read(fd,buf,MAXLINE)) > 0)							write(connfd,buf,n);						Close(connfd);					}					else		/* file is not a picture,deal it as html file type */						{						write(connfd,"HTTP/1.1 200 OK\r\n",17);						write(connfd,"Content-Type:text/html\r\n",24);						write(connfd,"\r\n",2);						while ((n = read(fd,buf,MAXLINE)) > 0)							write(connfd,buf,n);						Close(connfd);					}					exit(0);				}			}		}		else	/* parent process */		{			close(connfd);		}	}	return 0;}

⌨️ 快捷键说明

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