简单的web服务器实现
最近在学习网络编程,想通过写一个简单的web服务器作为实践练习。程序参照了书上的一些基本函数,功能只是支持访问一个gif图片。现在的bug是chrome浏览器访问时只能得到半张图,无论图片大小。ie无法访问。
其中http协议部分我是参考nginx的回复(用telnet看到的回复)来写死在程序里的。我对网络技术是初学完全不知道错误可能在哪?请高人帮我分析。下面是主要函数的代码:
int parseReq(char * req,int fd)
{
printf("req !!!\n");
char * delm = " ";
char * p;
p = strtok(req,delm);
if(!strcasecmp(p,"GET") || 1)
{
p = strtok(NULL,delm);
if(!strcasecmp(p,"/") || 1)
{
printf("gif output !!");
FILE * df = fopen("stock.gif","r");
char header[256];
sprintf(header,"HTTP/1.1 200 OK\r\n");
Writen(fd,header,strlen(header));
sprintf(header,"Server: joe/1.0\r\n");
Writen(fd,header,strlen(header));
char content[256];
sprintf(content,"Content-Type: image/gif\r\n");
Writen(fd,content,strlen(content));
struct stat info;
stat("stock.gif",&info);
printf("file size is %d",info.st_size);
sprintf(content,"Content-Length: %d\r\n",info.st_size);
Writen(fd,content,strlen(content));
sprintf(content,"Connection: keep-alive\r\n");
Writen(fd,content,strlen(content));
//sprintf(content,"Expires: 0\r\n");
//Writen(fd,content,strlen(content));
sprintf(content,"Cache-Control: max-age=2592000\r\n");
Writen(fd,content,strlen(content));
sprintf(content,"Accept-Ranges: bytes\r\n\r\n");
Writen(fd,content,strlen(content));
char buf[100];
size_t bytesize;
size_t totmem = 0;
while((bytesize = fread(buf,1,100,df)) > 0)
{
int nres = Writen(fd,buf,bytesize);
printf("one bundle !, %d ",nres);
totmem += bytesize;
}
printf(" total mem is %d \n",totmem);
}
return 0;
}
//其中的Write函数,参考书上的实现
ssize_t Write(int fd,void* buf,size_t nsize)
{
ssize_t n;
again:
if((n=write(fd,buf,nsize))==-1)
{
if(errno==EINTR)
goto again;
else
return -1;
}
return n;
}