2.1.3 http服务器的实现

简介: 2.1.3 http服务器的实现

关于HTTP服务器的实现,其实如果明白了HTTP协议,这个很容易实现,就是在上节课epoll+reactor的基础上,接收浏览器发送来的HTTP请求,之后组装一些数据发送出去即可。之前有记录过本地简易HTTP服务器

值得注意的是king老师课上讲的这个获取行内容很有用:

int readline(char *allbuf, int idx, char *linebuf) {
  int len = strlen(allbuf);
  for (; idx < len; idx++) {
    if (allbuf[idx] == '\r' && allbuf[idx + 1] == '\n') {
      return idx + 2;
    } else {
      *(linebuf++) = allbuf[idx];
    }
  }
  return -1;
}

还有响应的填充:

printf("resources: %s\n", conn->resource);
  int filefd = open(conn->resource, O_RDONLY);
  if (filefd == -1) {
    printf("errno: %d\n", errno);
    return -1;
  }
  //fseek(, SEEK_END)
  struct stat stat_buf;
  fstat(filefd, &stat_buf);
  int len = sprintf(conn->wbuffer, 
"HTTP/1.1 200 OK\r\n"
"Accept-Ranges: bytes\r\n"
"Content-Length: %ld\r\n"
"Content-Type: text/html\r\n"
"Date: Sat, 06 Aug 2022 13:16:46 GMT\r\n\r\n", stat_buf.st_size);
  len += read(filefd, conn->wbuffer+len, BUFFER_LENGTH-len);
  conn->wc = len;
  close(filefd);

使用sendfile零拷贝技术:

int filefd = open(conn->resource, O_RDONLY);
    if (filefd == -1) {
      printf("errno: %d\n", errno);
      return -1;
    }
    struct stat stat_buf;
    fstat(filefd, &stat_buf);
    int ret = sendfile(fd, filefd, NULL, stat_buf.st_size);  // sendbody
    if (ret == -1) {
      printf("errno: %d\n", errno);
    }
    close(filefd);

在访问图片资源时,需要修改响应协议:

"Content-Type: image/png\r\n"

最后讲到了HTTP协议头用key-value格式存储,便于解析数据。

从最初的reactor到现在的HTTP协议的解析与封装,其实都是一个思想,每一个链接所对应的资源或上下文都单独管理,比如一个链接对应一个结构体,这里面包含它的读写缓存,sockfd,如果考虑HTTP协议的话还可以加上对应的协议头的key-value形式的存储,之后,凡是涉及这个sockfd相关的资源,都可以在这个结构里面找到,这样一来就将业务和网络底层隔离开来,我们只需要关注读写buffer里面的内容。更进一步,当有多个链接时,如何更合理的管理这些链接(结构),链表的形式?还是什么样的数据结构,而目的就是为了能更快更方便的索引,找到对应的资源!其实我感觉这些才是这几节课要表达的核心!(这里说资源可能不太合适,但我想你应该懂我意思,就是与该sockfd相关的东西)

关于更多http服务器相关的实现,可以看我的之前实现的一个webserver项目:https://gitee.com/gao-yuelong/web-server

文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习:https://ke.qq.com/course/417774?flowToken=1020253

相关文章
|
7月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
351 18
|
7月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
385 14
|
6月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
6月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
467 0
|
9月前
|
JSON API 数据安全/隐私保护
使用curl命令在服务器上执行HTTP请求
总的来说,curl是一个非常强大的工具,它可以让你在命令行中发送各种类型的HTTP请求。通过学习和实践,你可以掌握这个工具,使你的工作更加高效。
837 30
|
8月前
|
存储 数据库 Python
使用HTTP POST协议将本地压缩数据发送到服务器
总的来说,使用HTTP POST协议将本地压缩数据发送到服务器是一个涉及多个步骤的过程,包括创建压缩文件,设置HTTP客户端,发送POST请求,以及服务器端的处理。虽然这个过程可能看起来复杂,但一旦你理解了每个步骤,就会变得相对简单。
304 19
|
8月前
|
存储 安全 数据安全/隐私保护
HFS-快速创建HTTP服务器
鉴于HFS的操作简便和方便快捷,它在满足快速,临时的文件分享和传输需求上,能够发挥出巨大的作用。只要明确了以上的安全警告,并做好了必需的安全设置,HFS将是一款实用的HTTP服务器工具。
881 9
|
Web App开发 前端开发 关系型数据库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
fuser可用于查询文件、目录、socket端口和文件系统的使用进程 1.查询文件和目录使用者 fuser最基本的用法是查询某个文件或目录被哪个进程使用: # fuser -v .
1002 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Datanode的日志中看到: 10/12/14 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.
794 0