【计算机网络】——自己实现一个Web服务器

我们耳熟能详的web服务器主要有简单快速的Apache、强大灵活的IIS,但是最常用的就是免费的Tomact等。这次我们要做的就是实现自己的web服务器,这个服务器它接收到浏览器发送的请求报文,对请求报文进行解析,并发送应答报文给浏览器,浏览器解析内容呈现界面给用户。

1、知识储备

1、在文件中读取和写入内容
使用系统调用open和read函数,详情请参考博文I/O操作之系统调用

2、获取字符串中的单个字符
使用字符分割函数strtok(),其原型如下:

# include<string.h>
char* strtok(char s[],const char* delim);//s为要分解的字符串,delim为分割字符

首次调用时,s指向要分割的字符串,之后再次调用把s设为NULL,表示接着上次分割的位置继续分割。
因为请求报文段中方法和URL是以空格来区分的,所以切割GET和URL的过程如下:

char *filename = strtok(recvbuff," ");//这个切割GET
filename = strtok(NULL," ");//这个切割“/index.html"

3、判断文件是否存在
因为我们把所有的html文件都放在/var/www/html这个路径下的。如下:我们可以通过命令来查看
在这里插入图片描述
所以我们要在在这个路径下寻找index.html文件是否存在。
判断文件的函数原型如下:

#include<unistd.h>
int access(const char* pathname, int mode);  
  • pathname:是文件的路径名+文件名,指定要测试的文件
  • mode:指明测试哪种权限,实际上有4种。后面三种情况可以用“或”的方法将多种情况合在一起测试
表示 含义
F_OK值为0 判断文件是否存在
R_OK值为4 判断对文件是否有读权限
W_OK值为2 判断对文件是否有写权限
X_OK值为1 判断对文件是否有读写权限

4、获取文件大小
因为在服务器给浏览器发送的响应报文段中,有一个是文件数据长度的量,那么我们怎样来获取呢?
其实就是使用stat函数来获取Linux文件的属性。函数原型如下:

#include <sys/stat.h>
int stat(const char*pathname,struct stat *buf)
  • pathname:文件的绝对路径或相对路径。
  • stat类型的结构体指针,可以保存文件的所有信息。使用前必须要进行初始化,即调用stat函数进行初始化。结构体中st_size属性就是文件大小

5、sprintf函数
我们使用了stat函数来获取到了文件的大小,但是这是一个整形值,因为服务器向浏览器发送的响应报文段是以字符串的形式发送的,所以我们还需要将这个整形值放入字符串中。那么,此时就需要用到sprintf函数。函数原型如下:

#include<stdio.h>
int sprintf(char *str, const char *format, ...)
  • str :这是指向一个字符数组的指针,该数组存储了 C 字符串
  • 剩下的就和printf一样了

2、实现步骤

核心的流程如下图所示:
在这里插入图片描述
1、建立连接
HTTP协议底层还是tcp,所以首先还是要socket()创建套接字,bind()绑定端口等信息,listen()建立监听队列,建立连接。while(1){ accept()接收客户端信息,客户端和服务器进行连接,,recv()接收数据,send()发送数据,close()}我们使用的是短连接,本次建立链接,接收数据,断开连接。循环建立,接收数据,发送数据,关闭。

2、处理浏览器连接
使用recv函数接收浏览器发来的HTTP请求报头存在recvbuff数组中。并寻找报头中的URL地址下寻找html文件。

3、给浏览器回馈数据
回馈的数据包括了应答报头和页面数据两个部分。应答报头就按照报文各字段的格式分别获取存在sendbuff数组里面。页面数据就通过只读的方式打开文件,并将文件里面的内容写到buff数组中,借助数组把数组send到网络中

3、代码实现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>

#include<sys/types.h>
#include<sys/socket.h>
#include< pa/inet.h>
#include<netinet/in.h>

#
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值