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

相关文章
|
26天前
|
安全 网络协议 网络安全
解析HTTP代理服务器不稳定致使掉线的关键原因
随着数字化发展,网络安全和隐私保护成为核心需求。HTTP代理服务器掉线原因主要包括:1. 网络问题,如本地网络不稳定、路由复杂;2. 服务器质量差、IP资源不稳定;3. 用户配置错误、超时或请求频率异常;4. IP失效或协议不兼容。这些问题会影响连接稳定性。
62 8
|
2月前
|
缓存 负载均衡 监控
HTTP代理服务器在网络安全中的重要性
随着科技和互联网的发展,HTTP代理IP中的代理服务器在企业业务中扮演重要角色。其主要作用包括:保护用户信息、访问控制、缓存内容、负载均衡、日志记录和协议转换,从而在网络管理、性能优化和安全性方面发挥关键作用。
94 2
|
3月前
|
搜索推荐 安全 网络安全
服务器支持HTTPS的时机和条件
【10月更文挑战第23天】服务器支持HTTPS的时机和条件
53 5
|
4月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
121 1
使用Netty实现文件传输的HTTP服务器和客户端
|
3月前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
153 0
|
5月前
HAProxy的高级配置选项-配置haproxy支持https协议及服务器动态上下线
文章介绍了如何配置HAProxy以支持HTTPS协议和实现服务器的动态上下线。
228 8
|
5月前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
70 1
|
6月前
|
移动开发 网络协议 编译器
实战案例3:C语言实现的HTTP服务器
实战案例3:C语言实现的HTTP服务器
406 0
|
测试技术 C#
[转]关于HTTP服务器每个客户端2个连接的限制
这两天猫在家里搞一个多线程的断点续传得C#程序,发现同时只能开2个线程下载,其他的线程一律要等待,这样就导致下载大文件时其他线程经常超时,郁闷好久。今天回公司无意中发现了一个帖子,终于真相大白了,       现摘录如下:       这几天在做IIS 6上Web Service (WSE 2.0)的性能测试。
1009 0
|
测试技术 C#
【转】关于HTTP服务器每个客户端2个连接的限制
http://www.cnblogs.com/lishenglyx/archive/2010/01/07/1641190.html       这两天猫在家里搞一个多线程的断点续传得C#程序,发现同时只能开2个线程下载,其他的线程一律要等待,这样就导致下载大文件时其他线程经常超时,郁闷好久。
844 0

热门文章

最新文章