/**
* 程序是用来作为Web服务器的,用于的作为客户请求,这提供服务的程序
* 由于服务器不需要可视话的界面,仅仅是提供一个后台的进程来响应客户的请求
* 我们知道的Web协议有HTTP,所有要实现web服务,就要知道HTTP协议的表现形似以及
* 响应的方式,客户端请求的格式是:Get filename,下面是具体的实现code
*/
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<netinet/in.h>
#include<netdb.h>
#include<stdlib.h>
#include<pthread.h>
#include<errno.h>
#include<stdio.h>
#define SOCKET_ERROR -1
/**
*下面的函数声明是用来进行客户端的请求解析的
*/
const char *openGET(const char *,int);
/**
*下面是主函数,用于服务的主函数
*/
int main(int argc,const char *argv[]){
int sockfd,newfd;
struct sockaddr_in hostaddr;
struct sockaddr_in clientaddr;
int clientlen=sizeof(struct sockaddr);
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==SOCKET_ERROR){
perror("socket faile");
exit(0);
}
hostaddr.sin_family=AF_INET;
hostaddr.sin_port=htons(80);
hostaddr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&hostaddr.sin_zero,0);
int ret=bind(sockfd,(struct sockaddr *)&hostaddr,sizeof(struct sockaddr));
if(ret==SOCKET_ERROR){
perror("socket faile");
close(sockfd);
exit(0);
}
int lisret=listen(sockfd,5);
if(lisret==SOCKET_ERROR){
perror("socket faile");
close(sockfd);
exit(0);
}
while(1){
printf("wait requestion........\n");
newfd=accept(sockfd,(struct sockaddr *)&clientaddr,&clientlen);
if(newfd==SOCKET_ERROR){
perror("accept fail");
close(sockfd);
exit(0);
}
printf("have request to.....\n");
char buf[100];
memset(buf,0,20);
int recvlen=recv(newfd,buf,100,0);
/**
*上面的代码已经获得了HTTP的请求了,并且已经得到客户端的请求
*下面的就是用于响应客户端的请求,也就是把客户端的请求响应给
*客户,那么就是传送文件或者是响应程序的运行结果
*下面就是对从客户端获得的请求进行解析以及响应
*/
const char *p=openGET(buf,100);
/**
*下面开始响应客户的请求,也就是读取文件并传送给客户
*由客户的浏览器进行显示,打开就是客户请求的文件
*/
int fd;
fd=open(p,O_RDONLY);
if(!fd){
printf("open file fail\n");
}
char readbuf[100];
memset(buf,0,512);
ssize_t reret=0;
printf("begin read data!\n");
/**
*下面是简单的打开用户请求的文件,并将其传送给请求的客户
*/
while((reret=read(fd,readbuf,100))>0){
printf("%s\n",readbuf);
send(newfd,readbuf,reret,0);
}
printf("errno:%s\n",strerror(errno));
printf("readbuf:%s len:%d\n",readbuf,reret);
/**
*当响应了客户的请求以后就可以关闭相应的文件描述符了,因为
*这样可以使响应速度更快,并且也不会占用资源
*/
close(fd);
close(newfd);
}
printf("create socket success\n");
return 0;
}
const char *openGET(const char *recv,int len){
char *buf=(char *)(recv+5);
static char data[100];
memset(data,0,100);
int i=0;
for(i=0; i<len; ++i){
if(buf[i]==' ')
break;
data[i]=buf[i];
}
return data;
}
简单的Web服务器模型
最新推荐文章于 2025-07-18 11:20:31 发布