简单的web服务器实现

beingjoey 2013-02-17 05:55:05
最近在学习网络编程,想通过写一个简单的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;
}


...全文
119 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
beingjoey 2013-02-18
  • 打赏
  • 举报
回复
问题解决了,问题不在http协议。而是我把fork出的父进程中的socket关掉了。对fork和socket理解不够啊。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 Books-Management-System C语言期末大作业——图书信息管理系统(C语言,单链表) 题目内容 ========== 1.系统名称 ------- 六、图书信息管理程序 2.基本要求 ------- 使用链表保存图书信息,每个节点要求包含图书的编号、书名、作者、购买日期和价格信息; 可以对当前图书数据库进行增加、删除操作,并实现按图书编号进行查询; 系统完成后应实现类似下图所示界面; 完成内容 ========== 1.基本任务 ----------- 使用链表保存图书信息: 图书编号; 图书名; 图书作者; 图书库存数量; 图书价格; 可对链表进行CRUD操作: 有Shell界面 2.拓展任务 ----------- 使用Git管理代码; 推送到上开源: 将代码分模块开发; 查询功能扩展根据书名和作者查询 有一定的异常管理机制; 设计内容 ========== 1.代码结构设计 --------------- 2.系统模块设计 --------------- 3.数据结构设计 ---------------- 3.1.链表: 结构体标志:Node 结构体声明变量:Book 结构体成员列表: 结构体代码: 4.算法设计 ------------ 4.1.冒泡排序法: 时间复杂度:$$O\left( n^{2} \right)$$; 算法原理: 比较相邻的元素。 如果第一个比第二个大,就交换他们两个; 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。 在这一点,最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 持续每次对越来越少...

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧