Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跨已建立的tcp连接下载时检测CRL文件的结尾_C_Sockets_Http_Tcp_Certificate Revocation - Fatal编程技术网

跨已建立的tcp连接下载时检测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标记不存在,要么我在错误的字节中查找它)。最好是

出于各种原因,我试图使用C语言中的粗糙工具下载一个CRL文件。我正在使用旧的
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没有在那一点上停止阅读,他会一直得到零,但这并不意味着这个答案有问题。这是真的。我已经习惯于使用谷歌搜索这样的东西,以至于它有一个男人我甚至都没有想到这个页面——我在网上找到的资源也毫无帮助。