我有这样一个需求:
先利用socket_connect( )建立TCP连接,
再用socket_write( )发送HTTP请求,
然后用socket_read( )读取HTTP响应数据。
代码如下:$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, ‘192.168.2.103’, 80);$buffer = "GET /index.html HTTP/1.1\r\n";
$buffer .= "Host: 192.168.2.103\r\n";
$buffer .= "User-Agent: Firefox/54.0\r\n";
$buffer .= "\r\n";socket_write($sock, $buffer, strlen($buffer));while(true) {
if(false === ($str_recv = socket_read($sock, 1024))) {
$errorcode = socket_last_error($sock);
$errormsg = socket_strerror($errorcode);
exit("{$errormsg}\n");
}
elseif($str_recv !== '') {
echo strlen($str_recv) . "\n";
}
}我利用while循环读取HTTP的响应数据,每次读取1KB,那么有个问题:读几次才能把HTTP响应数据读完?
我想在读取完HTTP响应数据后立刻关闭TCP连接,即调用socket_close( )关闭socket。
显然,目前的代码是个死循环,一直在调用socket_read( )读取数据,即使TCP连接的接收缓冲区已经没有数据了。
如何做才能在读取完所有的HTTP响应数据后立刻跳出while循环?
求指教!
先利用socket_connect( )建立TCP连接,
再用socket_write( )发送HTTP请求,
然后用socket_read( )读取HTTP响应数据。
代码如下:$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, ‘192.168.2.103’, 80);$buffer = "GET /index.html HTTP/1.1\r\n";
$buffer .= "Host: 192.168.2.103\r\n";
$buffer .= "User-Agent: Firefox/54.0\r\n";
$buffer .= "\r\n";socket_write($sock, $buffer, strlen($buffer));while(true) {
if(false === ($str_recv = socket_read($sock, 1024))) {
$errorcode = socket_last_error($sock);
$errormsg = socket_strerror($errorcode);
exit("{$errormsg}\n");
}
elseif($str_recv !== '') {
echo strlen($str_recv) . "\n";
}
}我利用while循环读取HTTP的响应数据,每次读取1KB,那么有个问题:读几次才能把HTTP响应数据读完?
我想在读取完HTTP响应数据后立刻关闭TCP连接,即调用socket_close( )关闭socket。
显然,目前的代码是个死循环,一直在调用socket_read( )读取数据,即使TCP连接的接收缓冲区已经没有数据了。
如何做才能在读取完所有的HTTP响应数据后立刻跳出while循环?
求指教!
那么当返回的字符串长度小于 1024 时,就可认为读取了全部数据
你还可以在此情况下再读一次,看看返回的是否为空串,来加以证实
类似文件尾的EOF