web服务器的实现
使用c语言实现了一个简单的web服务器。程序支持html,css,js,jpg,gif格式的请求[cpp]#include<stdio.h>#include<fcntl.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<string.h>#include<stdlib.h>#define PORT 12345#define WebRoot /home/meng/webpage/**** 字符串s1是否以s2结束*/int endsWith(char s1[],char s2[]){int len1 = strlen(s1);int len2 = strlen(s2);int i=len1-1,j=len2-1;if(len1<len2)return 0;for(;i>=0&&j>=0;i--,j--){if(s1[i]!=s2[j])return 0;}return 1;}int main(){int sockfd,fd,client;struct sockaddr_in addr;int len=sizeof(addr);char recbuf[2048];//socket连接if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){perror("socket.\n");exit(1);}//设置IP端口bzero(&addr,sizeof(addr));addr.sin_family=AF_INET;addr.sin_port=htons(PORT);addr.sin_addr.s_addr=inet_addr("127.0.0.1");//bindif(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr))<0){perror("bind.\n");exit(1);}//listen 最大连接数if(listen(sockfd,10)<0){perror("listen.\n");exit(1);}printf("listening...\n");while(1){//取得客户端的标识if((client=accept(sockfd,(struct sockaddr*)&addr,&len))<0){perror("accept.\n");exit(1);}//读取请求的头部int buf=0;if((buf=read(client,recbuf,2048))>=0){recbuf[buf]='\0';}//printf("%s\n",recbuf);char *token=strtok(recbuf," ");//获得HTTP请求第一行中间部分,也就是URIif(token!=NULL){token=strtok(NULL," ");}char type[256];/*** 根据请求资源结尾的扩展名不同,* 响应不同mine类型*/if(endsWith(token,".jpg")){strcpy(type,"image/jpeg\r\nAccept-Ranges:bytes");}else if(endsWith(token,".gif")){strcpy(type,"image/gif");}else if(endsWith(token,".js")){strcpy(type,"text/javascript");}else if(endsWith(token,".css")){strcpy(type,"text/css");}else{strcpy(type,"text/html");}//读取文件内容char filePath[1024];char content[2048*512];int fileSize;strcpy(filePath,"/home/meng/webpage");strcat(filePath,token);fd=open(filePath,O_RDONLY,0766);if(fd==-1){strcpy(content,"Not Found");}else{fileSize=read(fd,content,sizeof(content));//printf("%d\n",strlen(content));content[fileSize]='\0';if(fileSize<=0)strcpy(content,"Not Found");close(fd);}if(fileSize<=0){fileSize=strlen("Not Found");}char sendBuf[2048*1024];char tmp[20];sprintf(tmp,"%d",fileSize);memset(sendBuf,'\0',sizeof(sendBuf));//返回HTTP响应的头部信息//所有的返回状态都是200,暂不做404等其它响应状态的判断工作strcat(sendBuf,"HTTP/1.1 200 OK\r\n");strcat(sendBuf,"Server:MENGXIANLU\r\n");strcat(sendBuf,"Content-Length:");strcat(sendBuf,tmp);strcat(sendBuf,"\r\n");strcat(sendBuf,"Content-Type: ");strcat(sendBuf,type);strcat(sendBuf,"\r\n");//下面极其重要,表示响应头部的结束。//头部结束后就是正文部分了strcat(sendBuf,"\r\n");/** 响应头部 END */int i,j;/** 响应内容(正文) *//** 不能使用 strcat进行字符串的连接了。*//**如果请求的是图片,其字节码中有可能包含'\0'如果使用strcat有可能造成信息的截断*/for(i=0,j=strlen(sendBuf);i<fileSize;i++,j++){sendBuf[j]=content[i];}/** 一切准备就绪 */sendBuf[j]='\0';/**结果返回给客户端*/ 补充:软件开发 , C++ ,
上一个:namespace
下一个:算法笔记 之 快速排序的几种写法
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊