通过已建立的 TCP 连接下载时检测 CRL 文件的结尾

Detect end of CRL file when downloading across established tcp connection

出于各种原因,我正在尝试使用 C 中的原始工具下载 CRL 文件。我正在使用旧的 socket() 打开一个 tcp 连接,通过 [=11= 发送一个硬编码的明文 http 请求],通过 recv() 将结果读入缓冲区,然后将该缓冲区写入文件(稍后我将使用该文件来验证各种证书)。

recv() 和写入文件的部分在一个 while 循环中,这样我就可以全部搞定。

我的问题是我有一段时间想出一种可靠的方法来确定我何时完成接收文件(因此可以跳出 while 循环)。到目前为止我想出的所有东西要么有误报,要么有误报(返回 0 字节的情况太频繁了,要么 EOF 标记不存在,要么我在寻找错误的字节)。最好是一种不会引入很多额外复杂性的技术。

真的,我有主机、端口和路径(都是 char*)。在远端,有一个友好的 http 服务器(虽然不是我控制的)。如果没有大量额外的代码复杂性,我会很高兴能为我提供文件。如果我可以访问命令行,我会选择 wget 之类的东西,但我没有在 C API 端找到任何直接的等价物,而 system() 是一个糟糕的选择情况。

'Getting back zero bytes',我假设你的意思是 recv() 返回零,只有当对等方完成发送数据并关闭连接时才会发生。除非对方在每个连接中向您发送多个文件,否则这是该文件结束的可靠标志。 'Too frequently' 是胡说八道:每个连接只能发生一次。

但是如果对等点是 HTTP 服务器,它应该向您发送 Content-length header。请参阅 RFc 2616。