Http Server C语言.docx
《Http Server C语言.docx》由会员分享,可在线阅读,更多相关《Http Server C语言.docx(18页珍藏版)》请在冰点文库上搜索。
HttpServerC语言
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//建立socket开始侦听接收连接接收客户端数据解析http协议发送文件数据给客户端
#defineHTTP_PORT"2010"
#defineMAX_CONNECTION10
#defineDOCUMENT_ROOT"www"
#defineLOG_PATH"log/access.log"
voidparser(char*s,charres[][255],charhost[][255]);
staticchar*strtoupper(char*s);
staticlongfilesize(constchar*filename);
staticintfile_exists(constchar*filename);
staticvoidmime_content_type(constchar*name,char*ret);
staticintWriteLog(constchar*message);
staticintis_dir(constchar*filename);
staticunsignedshortg_is_log=1;
staticintg_log_fd=0;
intmain(void)
{
intserver_sock;
intclient_sock;
structsockaddr_inserver_addr;
structsockaddr_inclient_addr;
structsockaddr_insin;
structstatfile_stat;
pid_tpid;
charclient_ip[100];
charbuf[20000];
charbuf_all[2000];
charbuf1[2000];
charp[3][255];
charh[3][255];
chartmp[2000];
charcwd[1024];
charfilename[2000];
charfilepath[2000];
intfd,size;
intcurrentConn=0;
DIR*dir;
structdirent*ptr;
chdir("../");
if((pid=fork())<0)
{
perror("fork");
exit
(1);
}
elseif(pid!
=0)
{
exit
(1);
}
if((server_sock=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
exit
(1);
}
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(atoi(HTTP_PORT));
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(server_sock,(structsockaddr*)&server_addr,sizeof(server_addr))<0)
{
perror("bind");
exit
(1);
}
if(listen(server_sock,MAX_CONNECTION)<0)
{
perror("listen");
exit
(1);
}
printf("fasthttpsuccessfulcreated...\n");
while
(1)
{
unsignedintclientlen=sizeof(client_addr);
if((client_sock=accept(server_sock,(structsockaddr*)&client_addr,&clientlen))<0)
{
perror("accept");
exit
(1);
}
if((pid=fork())==0)
{
if(read(client_sock,buf,20000)<0)
{
perror("readdatafromclient");
exit
(1);
}
parser(buf,p,h);
if(strcmp(strtoupper(p[0]),"GET")!
=0
&&strcmp(strtoupper(p[0]),"POST")!
=0
&&strcmp(strtoupper(p[0]),"HEAD")!
=0)
{
memset(&buf,0,sizeof(buf));
sprintf(buf,"HTTP/1.1501NotImplemented\r\nServer:
%s\r\nContent-Type:
text/html\r\nContent-Length:
1489\r\nAccept-Ranges:
bytes\r\nConnection:
close\r\n\r\n","Apache");
write(client_sock,buf,strlen(buf));
memset(&buf,0,sizeof(buf));
sprintf(buf,"
%sMethodNotImplemented
","501");
write(client_sock,buf,strlen(buf));
close(client_sock);
exit(0);
}
if(strcmp(p[1],"/")==0)
{
memset(&tmp,0,sizeof(tmp));
sprintf(tmp,"%s","index.html");
strcat(p[1],tmp);
}
WriteLog(p[1]);
getcwd(filepath,sizeof(filepath));
strcat(filepath,"/");
strcat(filepath,DOCUMENT_ROOT);
strcat(filepath,p[1]);
if(!
file_exists(filepath))
{
memset(&buf,0,sizeof(buf));
sprintf(buf,"HTTP/1.1404NotFound\r\nServer:
%s\r\nContent-Type:
text/html\r\nContent-Length:
257271\r\nConnection:
close\r\n\r\n","Apache");
write(client_sock,buf,strlen(buf));
memset(&buf,0,sizeof(buf));
sprintf(buf,"
404NotFound404NotFound
Poweredby%s