用c写的一个简单web服务器实现 转载来自sdlcwangsong

来源:互联网 发布:淘宝支付怎么用花呗 编辑:程序博客网 时间:2024/05/22 10:46

本程序的目的是实现一个web服务器,在服务器启动时读取配置文件config.txt,然后浏览器向服务器发送请求,服务器向浏览器发送index.html,文件发送完毕后服务器关闭与浏览器的链接,告知浏览器文件已发送完毕,浏览器收到index.html文件后发现还有一个图片,于是再次发送请求,服务器接收到请求后又发送图片信息,发送完毕后关闭连接。之后,浏览器就显示了完整的网页了。

下面是实现的程序(写的很粗糙)

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define MAXLINE 80int main(void){struct sockaddr_in servaddr,cliaddr;socklen_t cliaddr_len;int listenfd,connfd;int p,length=0;char *ip;char *port=NULL;FILE *fp_config;char buf[MAXLINE];char str[INET_ADDRSTRLEN];int i,n;char title[15];int fd_index,fd_jpg,ret;fp_config=fopen("config.txt","r");if(fp_config<0){printf("open file error!\n");return 1;}getline(&port,&length,fp_config);for(i=0;i<strlen(port);i++){if(port[i]=='\n')port[i]='\0';}p=atoi(port);listenfd=socket(AF_INET,SOCK_STREAM,0);int opt=1;setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(p);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);while(1){n=read(connfd,buf,MAXLINE);if(n==0){printf("the other side has been closed.\n");break;}i=0;while(buf[i]!='\r'){title[i]=buf[i];i++;}title[i]='\0';if(0==(strcmp(title,"GET / HTTP/1.1"))){bzero(buf,MAXLINE);strcpy(buf,"HTTP/1.1 200 OK\r\n");write(connfd,buf,strlen(buf));bzero(buf,MAXLINE);strcpy(buf,"Content-Type: text/html\r\n");write(connfd,buf,strlen(buf));bzero(buf,MAXLINE);buf[0]='\r';buf[1]='\n';write(connfd,buf,2);fd_index=open("index.html",O_RDONLY);if(fd_index<0){printf("open file error!\n");return fd_index;}bzero(buf,MAXLINE);while((ret=read(fd_index,buf,MAXLINE))>0){write(connfd,buf,ret);printf("send index data...\n");bzero(buf,MAXLINE);}close(fd_index);close(connfd);connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);bzero(buf,MAXLINE);n=read(connfd,buf,MAXLINE);i=0;while(buf[i]!='\r'){title[i]=buf[i];i++;}title[i]='\0';if(0==(strcmp(title,"GET /mypic.jpg HTTP/1.1"))){bzero(buf,MAXLINE);strcpy(buf,"HTTP/1.1 200 OK\r\n");write(connfd,buf,strlen(buf));bzero(buf,MAXLINE);strcpy(buf,"Content-Type: image/jpg\r\n");write(connfd,buf,strlen(buf));bzero(buf,MAXLINE);buf[0]='\r';buf[1]='\n';write(connfd,buf,2);fd_jpg=open("mypic.jpg",O_RDONLY);if(fd_jpg<0){printf("open file error!\n");return fd_jpg;}bzero(buf,MAXLINE);while((ret=read(fd_jpg,buf,MAXLINE))>0){write(connfd,buf,ret);printf("send index data...\n");bzero(buf,MAXLINE);}close(fd_jpg);close(connfd);connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len);}}}}}


在当前路径下有以下文件



首先打开服务器,


然后在浏览器中输入本机IP地址127.0.0.1,浏览器显示完整网页


0 0