Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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
有没有一种方法可以使用libcurl>;从HTTP头获取内容长度=7.3.x?_C_Libcurl - Fatal编程技术网

有没有一种方法可以使用libcurl>;从HTTP头获取内容长度=7.3.x?

有没有一种方法可以使用libcurl>;从HTTP头获取内容长度=7.3.x?,c,libcurl,C,Libcurl,我正在使用libcurl库接收HTTP请求。我想知道正文的内容长度,以便分配内存。是否有库函数或libcurl库支持的解析HTTP头的方法?我不太确定检索内容长度的最有效方法是什么,当我收到标题时,我想使用libcurl中被认为是标准的内容长度。我咨询过,但没有发现任何东西 您可以通过获取内容长度,但我不建议您依赖于此 HTTP并不要求发送标头,事实上,大量HTTP响应在没有标头的情况下发送,因此客户端事先不知道大小 HTTP响应可能非常大,因此如果您的客户机不能完全控制它将获得的资源,那么在内

我正在使用libcurl库接收HTTP请求。我想知道正文的内容长度,以便分配内存。是否有库函数或libcurl库支持的解析HTTP头的方法?我不太确定检索内容长度的最有效方法是什么,当我收到标题时,我想使用libcurl中被认为是标准的内容长度。我咨询过,但没有发现任何东西

您可以通过获取
内容长度
,但我不建议您依赖于此

  • HTTP并不要求发送标头,事实上,大量HTTP响应在没有标头的情况下发送,因此客户端事先不知道大小
  • HTTP响应可能非常大,因此如果您的客户机不能完全控制它将获得的资源,那么在内存中分配和存储整个响应可能是一个非常糟糕的主意

  • 您说过“我使用的协议需要总长度”,但这并不意味着HTTP将为您提供一个。然后,您可能应该首先获得HTTP响应并计算出总大小,然后再使用第二个需要预先计算大小的协议来传递数据

    您可以通过获取
    内容长度
    ,但我不建议您依赖于此

  • HTTP并不要求发送标头,事实上,大量HTTP响应在没有标头的情况下发送,因此客户端事先不知道大小
  • HTTP响应可能非常大,因此如果您的客户机不能完全控制它将获得的资源,那么在内存中分配和存储整个响应可能是一个非常糟糕的主意

  • 您说过“我使用的协议需要总长度”,但这并不意味着HTTP将为您提供一个。然后,您可能应该首先获得HTTP响应并计算出总大小,然后再使用第二个需要预先计算大小的协议来传递数据

    无需解析任何标题-如果您想自己处理到达的数据,查看签名的方式可以很明显地看出,调用中包含了内容的大小,这并不令人惊讶/意外:
    size\u t write\u data(void*buffer,size\t size,size\t nmemb,void*userp)是,但nmemb是在回调调用时传入的大小,而不是内容长度。不幸的是,我使用的协议需要总长度。
    size*nmemb
    是缓冲区的内容长度-如果不是,您将无法使用libcurl下载二进制文件,是吗?可能其中一个是1,另一个是字节数。试一试,看看。难道没有这种情况吗?你听说过“开源”的一个重要优点是,呃,开源是开放的,所以你可以自己检查这类东西。或者尝试一下,看看自己从执行下载。但很显然,如果libcurl可以用来下载任意长度的文件,那么处理任意长度的文件
    size*nmemb
    必须是文件中的字节数。否则,收到的文件将是不同的(更大的)长度。无需解析任何标题-如果您想自己处理到达的数据,查看您这样做的方式的签名可以很明显地看出,调用中包含了内容的大小,这并不太令人惊讶/意外:
    size\u t write\u data(void*buffer,size\u t size,size\u t nmemb,void*userp);
    是的,但nmemb是回调调用时传入的大小,而不是内容长度。不幸的是,我使用的协议需要总长度。
    size*nmemb
    是缓冲区的内容长度-如果不是,您将无法使用libcurl下载二进制文件,是吗?很可能其中之一是1和另一个是字节数。试试看。有没有这种情况?你听说过“开源”的一个重要优势吗是因为源代码是开放的,所以你可以自己检查这类东西。或者尝试一下,看看是否执行下载。但很自然,如果可以使用libcurl下载任意长度的文件,那么处理任意长度的文件
    size*nmemb
    必须是文件中的字节数。否则,received文件的长度将不同(更大)。