Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
为什么php fread()函数有时会在每行前面加上长度前缀?_Php_Sockets - Fatal编程技术网

为什么php fread()函数有时会在每行前面加上长度前缀?

为什么php fread()函数有时会在每行前面加上长度前缀?,php,sockets,Php,Sockets,我使用PHP从套接字执行POST请求。以下是一段代码片段: // open a socket connection on port 80 $fp = fsockopen($host, 80); // send the request headers: fwrite($fp, "POST $path HTTP/1.1\r\n"); fwrite($fp, "Host: $host\r\n"); fwrite($fp, "Referer: $referer\r\n"); fwrite($fp, "

我使用PHP从套接字执行POST请求。以下是一段代码片段:

// open a socket connection on port 80
$fp = fsockopen($host, 80);

// send the request headers:
fwrite($fp, "POST $path HTTP/1.1\r\n");
fwrite($fp, "Host: $host\r\n");
fwrite($fp, "Referer: $referer\r\n");
fwrite($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-length: ". strlen($data) ."\r\n");
fwrite($fp, "Connection: close\r\n\r\n");
fwrite($fp, $data);

$result = ''; 
while(!feof($fp)) {
    // receive the results of the request
    $result .= fread($fp, 5000);
}
然而,响应的每一行似乎都以十六进制的长度作为前缀。为什么会这样

例如,我向其发布的测试cgi脚本返回其环境:

BASH=/bin/bash
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
但我的PHP函数的结尾是:

f
BASH=/bin/bash

69
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath

10
BASH_ALIASES=()

您应该使用
HTTP/1.0
,因为1.1服务器通常以传输编码响应:
chunked
(=以十六进制数字为前缀的部分)


您可以尝试发送请求,请求使用
标识
内容编码,但所有HTTP/1.1客户端都需要使用chunked作为传输格式,因此这可能不可靠。

您应该使用
HTTP/1.0
,因为1.1服务器通常使用传输编码进行响应:
chunked
(=以十六进制数字为前缀的部件)


您可以尝试发送请求,请求使用
标识
内容编码,但所有HTTP/1.1客户端都需要使用分块作为传输格式,因此这可能不可靠。

不是每行都以长度为前缀。正如mario建议的,服务器以分块的形式发送数据。每个分块都以c的长度开始块本身可以包含任何有效的(就http而言)数据,这意味着它也可以包含多行


你可以自己使用它。如果你收到一个chunked传输,你可以给fread()块的长度作为参数,而不是abritary int(这里:5000)。因此,您将立即收到整个区块。

不是每一行都以其长度作为前缀。正如mario建议的那样,服务器将数据作为区块发送。每个区块都以区块的长度、数据和一个双换行(=>空行)开始。区块本身可以包含任何有效的(就http而言)数据,这意味着它也可以包含多行

你可以自己使用它。如果你收到一个chunked传输,你可以给fread()一个chunk的长度作为参数,而不是abritary int(这里是5000)。这样你就可以一次收到整个chunk