跨已建立的tcp连接下载时检测CRL文件的结尾
出于各种原因,我试图使用C语言中的粗糙工具下载一个CRL文件。我正在使用旧的跨已建立的tcp连接下载时检测CRL文件的结尾,c,sockets,http,tcp,certificate-revocation,C,Sockets,Http,Tcp,Certificate Revocation,出于各种原因,我试图使用C语言中的粗糙工具下载一个CRL文件。我正在使用旧的socket()打开一个tcp连接,通过send()发送一个硬编码的明文http请求,通过recv()将结果读取到一个缓冲区,然后将该缓冲区写入一个文件(稍后我将使用它来验证各种证书) recv() 我的问题是,我花了很长时间才想出一种可靠的方法来确定何时接收完文件(因此可以打破while循环)。到目前为止,我想出的所有方法都有误报或漏报(返回0字节的情况太频繁,要么EOF标记不存在,要么我在错误的字节中查找它)。最好是
socket()
打开一个tcp连接,通过send()
发送一个硬编码的明文http请求,通过recv()
将结果读取到一个缓冲区,然后将该缓冲区写入一个文件(稍后我将使用它来验证各种证书)
recv()
我的问题是,我花了很长时间才想出一种可靠的方法来确定何时接收完文件(因此可以打破while循环)。到目前为止,我想出的所有方法都有误报或漏报(返回0字节的情况太频繁,要么EOF标记不存在,要么我在错误的字节中查找它)。最好是,这种技术不会带来太多额外的复杂性
实际上,我有一个主机、端口和路径(都是char*
)。在远端,有一个友好的http服务器(虽然不是我控制的)。我很高兴能够在不增加大量代码复杂性的情况下获得该文件。如果我可以访问命令行,我会选择类似wget的东西,但我还没有在C API方面找到任何直接等价物,以及system()在这种情况下,
是一个糟糕的选择。返回零字节,我想你的意思是recv()
返回零,仅当对等方完成发送数据并关闭连接时才会发生。除非对等方每次连接向您发送多个文件,否则这是此文件结束的绝对正确标志。“太频繁”是胡说八道:每次连接只能发生一次
但是,如果对等服务器是HTTP服务器,它应该向您发送一个内容长度头。请参阅RFc 2616。OP已经声明,他返回了许多返回0的读取。对我来说,这表明OP已经发现查找0字节计数是不够的……或者这意味着我错误地诊断了一个错误。事实上,pro错误诊断的问题是我希望从某人那里得到一个规范的答案的原因。@user3629249对我来说,它只表明您没有阅读recv()的手册页.
如果你断言每次连接都可能发生不止一次,那你就是在胡说八道。当然,如果OP没有在那一点上停止阅读,他会一直得到零,但这并不意味着这个答案有问题。这是真的。我已经习惯于使用谷歌搜索这样的东西,以至于它有一个男人我甚至都没有想到这个页面——我在网上找到的资源也毫无帮助。