C 正在尝试编写代理服务器。内容长度管理问题

C 正在尝试编写代理服务器。内容长度管理问题,c,http,streaming,proxy-server,C,Http,Streaming,Proxy Server,我正在尝试在Linux下用C语言编写一个代理服务器。它运行良好(我感觉它运行良好),直到我尝试将其用于流媒体 让我先告诉你这个问题,然后我会跳到流媒体上。 要读取来自网站的传入数据并将其转发给实际客户,我需要这样做 count = read(websitefd,buffer,BUFSIZ); write(clientfd,buffer,count);` 在一个连续的while循环中,直到我读取了该套接字上的所有数据 现在的问题是,如果实际的网站发送一个HTTP数据包,其中内容长度字段为10

我正在尝试在Linux下用C语言编写一个代理服务器。它运行良好(我感觉它运行良好),直到我尝试将其用于流媒体

让我先告诉你这个问题,然后我会跳到流媒体上。 要读取来自网站的传入数据并将其转发给实际客户,我需要这样做

count = read(websitefd,buffer,BUFSIZ);

write(clientfd,buffer,count);` 
在一个连续的while循环中,直到我读取了该套接字上的所有数据

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


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

首先,我强烈建议使用现有代理服务器作为任何代理系统的基础。HTTP标准相当复杂,比您意识到的要复杂得多。如果要实现代理服务器,请首先至少读取三次

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

  • 如果存在
    内容长度
    标头,但不存在
    传输编码
    标头:
    内容长度
    标头指定要中继的数据量(以字节为单位)。只是进入一个循环复制
  • 如果存在
    Transfer Encoding:chunked
    头:您必须解析块头。这种编码经常用于流式数据,其中总大小事先未知。它还经常用于脚本生成的动态数据
  • 如果存在其他
    传输编码
    头:关闭连接并报告500错误,除非您知道该编码是什么
  • 如果
    内容长度
    标题不存在,并且不存在
    传输编码
    标题:检查
    连接:关闭
    (在HTTP/1.1中必须存在)和
    连接:保持活动状态
    (在HTTP/1.0中不得存在)。如果违反这些条件,则触发500错误。否则,只需继续传递数据,直到服务器关闭连接

我故意对此有点吹毛求疵——如果您从头开始实现代理服务器,您必须阅读该标准,否则您肯定会引入浏览器不兼容和/或安全漏洞!所以请不要这样做。使用或什么作为核心代理服务器,只需为您需要的任何功能编写插件。

首先,我强烈建议使用现有代理服务器作为任何代理系统的基础。HTTP标准相当复杂,比您意识到的要复杂得多。如果要实现代理服务器,请首先至少读取三次

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

  • 如果存在
    内容长度
    标头,但不存在
    传输编码
    标头:
    内容长度
    标头指定要中继的数据量(以字节为单位)。只是进入一个循环复制
  • 如果存在
    Transfer Encoding:chunked
    头:您必须解析块头。这种编码经常用于流式数据,其中总大小事先未知。它还经常用于脚本生成的动态数据
  • 如果存在其他
    传输编码
    头:关闭连接并报告500错误,除非您知道该编码是什么
  • 如果
    内容长度
    标题不存在,并且不存在
    传输编码
    标题:检查
    连接:关闭
    (在HTTP/1.1中必须存在)和
    连接:保持活动状态
    (在HTTP/1.0中不得存在)。如果违反这些条件,则触发500错误。否则,只需继续传递数据,直到服务器关闭连接

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

我认为媒体是分块传输的,即不存在任何内容长度,并且在完成之前发送数据。 正如bdonlan所说,请阅读分块数据是如何工作的


我同意HTTP是相当令人讨厌的(由于时间上的许多变化和解释)

我认为媒体是分块传输的,也就是说,没有内容长度,在完成之前发送数据。 正如bdonlan所说,请阅读分块数据是如何工作的


我也同意HTTP是相当糟糕的(由于时间上的许多变化和解释)

非常感谢@bdonlan。我真的在寻找这样一个能为我澄清一切的答复。我一定要看说明书。再次感谢。如果可以的话,我已经对这个答案投了10次票。实际上,我已经决定编写自己的代理,因为我找不到代理服务器库。你能建议我吗