gpt4 book ai didi

c - 试图写一个代理服务器。内容长度管理问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:43:14 25 4
gpt4 key购买 nike

我想在Linux下用C语言写一个代理服务器。在我尝试将其用于流媒体之前,它运行良好(我认为它运行良好)。

让我先说出问题,然后我会跳到流媒体上。要从网站读取传入数据并将其转发给实际客户,我会这样做

count = read(websitefd,buffer,BUFSIZ);

write(clientfd,buffer,count);`

在连续的 while 循环中,直到我读取该套接字上的所有数据。

现在的问题是,如果实际网站发送一个内容长度字段为 1025 字节的 HTTP 数据包,而其他数据包中的其他部分数据,那么我仍然总是等待 BUFSIZ(8192 字节),然后我向客户端发送 8192 字节机器一起。对于普通的 octet-stream 它工作正常,即使我知道它不是正确的方法,因为我应该转发与实际服务器相同的数据包。因此,如果实际服务器向我发送 2 个大小为 1024 和 1024 字节的数据包,我向客户端发送一个 2048 字节的数据包,其中第一个数据包带有 HTTP header ,表示内容长度为 900 字节(其余均为 http header 假设)但实际上我向客户端转发了一个 2048 字节的数据包。对于内容类型:application/octet-stream,它只是下载整个内容并将其显示为图像或 html 文本,或者要求我保存它。

当客户端请求流媒体时,由于上述原因客户端无法播放视频。那我现在该怎么办?感谢您阅读我的问题。请帮帮我。 :)

最佳答案

首先,我强烈建议使用现有的代理服务器作为任何代理系统的基础。 HTTP 标准非常复杂,比您想象的要复杂得多。如果您要实现代理服务器,请阅读 RFC 2616至少先三次。

其次,您的代理服务器必须解析 HTTP header 以确定它必须发送多少。了解要发送多少数据的三种主要方式如下:

  • 如果存在 Content-Length header 并且不存在 Transfer-Encoding header :Content-Length header 指定了多少数据以字节为单位进行中继。只需进入循环复制即可。
  • 如果存在 Transfer-Encoding: chunked header :您必须解析 chunked transfer encoding block 头。这种编码经常用于流式数据,其中总大小无法提前得知。它还经常用于脚本生成的动态数据。
  • 如果存在其他一些 Transfer-Encoding header :关闭连接并报告 500 错误,除非您知道该编码是什么。
  • 如果不存在 Content-Length header ,并且不存在 Transfer-Encoding header :检查 Connection: close(必须在 HTTP/1.1 中存在)和 Connection: keep-alive(在 HTTP/1.0 中不得存在)。如果违反这些条件,则触发 500 错误。否则就继续传递数据,直到服务器关闭连接。

我故意让这有点夸张——如果你从头开始实现代理服务器,你必须阅读标准,否则你肯定会引入浏览器不兼容和/或安全漏洞!所以,请不要这样做。使用 lighttpdvarnish或作为核心代理服务器的东西,只需为您需要的任何功能编写一个插件即可。

关于c - 试图写一个代理服务器。内容长度管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5118741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com