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

📄 httpserver.c

📁 http协议的服务器例程
💻 C
字号:
#include "httpserver.h"#define Limit 10240#define Maxsize 1024int sd;int child = 0;int port = 80;char *dir;char arg[1024];sigset_t sigset;void sigchld(int x){	signal(SIGCHLD, sigchld);	waitpid(-1, NULL, WNOHANG);	child--;}void sighup(int x){	close(sd);	printf("%s\n", arg);	execl(arg, arg, NULL);}void sigalrm(int x){	printf("alarm\n");}int main(int argc, char **argv){	int cd;	int file;	int pip[2];	int error = 0;	int start = 0;	int end = 0;	int current = 0;	int childnum = 1024;	char filebuff[Maxsize];	char *p;	char *q;	char *buff;	char filename[1024];	off_t currpos;	pid_t pid;	fd_set fd;	time_t timenow;	socklen_t len;	struct sockaddr_in client;	if(wdaemon(W_NOCHDIR|W_NOCLOSE) < 0)	{		perror("wdaemon");		exit(-1);	}	memcpy(arg, argv[0], strlen(argv[0]));	if(httplog() < 0)	{		perror("httplog");		exit(-1);	}	if((dir = readconf(&port, &childnum)) == NULL)	{		dir = "/var/www/";	}	signal(SIGCHLD, sigchld);	signal(SIGHUP, sighup);	sigemptyset(&sigset);	sigaddset(&sigset, SIGCHLD);	if((sd = winetserver(W_TCP, port)) < 0)	{		exit(-1);	}	while(1)	{		len = sizeof(struct sockaddr_in);		FD_ZERO(&fd);		FD_SET(sd, &fd);		if(select(wmax(1, sd) + 1, &fd, NULL, NULL, NULL) < 0)		{			continue;		}		if(FD_ISSET(sd, &fd))		{			if(pid = waitpid(-1, NULL, WNOHANG) > 1)			{				child--;			}			if(child >= childnum)			{				continue;			}			if((cd = accept(sd, (struct sockaddr *)&client, &len)) < 0)			{				continue;			}			pid = fork();			if(pid > 0)			{				child++;				close(cd);				continue;			}			else if(pid == 0)			{				close(sd);				while(buff = wgets(cd), buff[0] != '\r')				{					if((p = strstr(buff, "GET /")) != NULL)					{						q = strstr(buff, "HTTP");						bzero(filebuff, sizeof(filename));						strncpy(filebuff, buff+5, q-p-6);						if(filebuff[0] < 2)						{							strcpy(filebuff, "index.htm");						}						sprintf(filename, "%s%s", dir, filebuff);						if((file = open(filename, O_RDONLY)) < 0)						{							sprintf(filename, "%s%s", dir, "404.html");							if((file = open(filename, O_RDONLY)) < 0)							{								close(cd);								exit(-1);							}							error = 1;						}						currpos = lseek(file, 0, SEEK_END);					}					else if((p = strstr(buff, "Range: bytes=")) != NULL)					{						if((sscanf(buff + 13, "%d-%d", &start, &end)) < 2)						{							end = currpos - 1;						}					}					else					{					}				}				bzero(filebuff, sizeof(filebuff));				if(end != 0)				{					strcpy(filebuff, "HTTP/1.1 206 Partial Content\r\n");				}				else if(error == 1)				{					strcpy(filebuff, "HTTP/1.1 302 Found\r\n");				}				else				{					strcpy(filebuff, "HTTP/1.1 200 OK\r\n");				}				wwrite(cd, filebuff, strlen(filebuff));				timenow = time(NULL);				strftime(filebuff, 1024, "Date: %a, %d %b %G %X GMT\r\n", gmtime(&timenow));				wwrite(cd, filebuff, strlen(filebuff));				strcpy(filebuff, "Server: WangAn/1.0\r\n");				wwrite(cd, filebuff, strlen(filebuff));				if(end != 0)				{					sprintf(filebuff, "Content-Length: %d\r\n", current = end - start + 1);					wwrite(cd, filebuff, strlen(filebuff));					sprintf(filebuff, "Content-Range: bytes %d-%d/%d\r\n", start, end, currpos);					wwrite(cd, filebuff, strlen(filebuff));				}				else				{					sprintf(filebuff, "Content-Length: %d\r\n", current = currpos);					wwrite(cd, filebuff, strlen(filebuff));				}				if(error == 1)				{					sprintf(filebuff, "Location: 404.html\r\n");					wwrite(cd, filebuff, strlen(filebuff));				}				strcpy(filebuff, "\r\n");				wwrite(cd, filebuff, strlen(filebuff));				lseek(file, start, SEEK_SET);				while(current > sizeof(filebuff))				{					bzero(filebuff, sizeof(filebuff));					wread(file, filebuff, sizeof(filebuff));					wwrite(cd, filebuff, sizeof(filebuff));					current = current - (sizeof(filebuff));					usleep((int)(1000000./(float)(Limit/Maxsize)));				}				bzero(filebuff, sizeof(filebuff));				wread(file, filebuff, current);				wwrite(cd, filebuff, current);				close(cd);				close(file);				exit(0);			}			else if(pid < 0)			{				continue;			}		}		else		{			continue;		}	}}

⌨️ 快捷键说明

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