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

时间:2015-07-30 21:12:18

标签: c sockets http tcp certificate-revocation

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

recv()和写入文件部分位于while循环中,以便我可以全部获取。

我的问题是,我有一段时间想出一个可靠的方法来确定我何时完成了接收文件(因此可以突破while循环)。到目前为止,我提出的所有内容都有误报或漏报(过于频繁地返回0字节,并且EOF标记不存在或者我正在查找错误的字节)。优选地,它将是一种不会引入许多额外复杂性的技术。

真的,我有一个主机,端口和一个路径(全部为char*)。在远端,有一个友好的http服务器(虽然不是我控制的)。如果没有大量额外的代码复杂性,我会对能够获得文件的任何内容感到高兴。如果我可以访问命令行,我会选择像wget这样的东西,但是我没有在C API方面找到任何直接的等价物,system()对于这种情况来说是一个糟糕的选择。

1 个答案:

答案 0 :(得分:1)

'返回零字节',我假设你的意思是recv()返回零,只有在对等方完成发送数据并关闭连接时才会发生。除非对等方每个连接发送多个文件,否则这是此文件结尾的绝对可靠信号。 “太频繁”是无稽之谈:每次连接只能发生一次。

但如果对等方是HTTP服务器,它应该向您发送Content-length标头。见RFc 2616。