本程序的目的是实现一个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 80
int 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,浏览器显示完整网页