服务器返回的响应中包含了当前返回内容的长度。
iis返回一个content-length.根据这个长度来循环,每遇到一个\r\n就加1。遇不到则跳出。
这样文件指针就不会错误地被指向远处。或者没有达到结尾就结束。然而。如果服务器输出的内容的所有行并不都包含\r\n呢。我不知道怎么解决。请各位兄弟指点迷津。

解决方案 »

  1.   

    我没用过这些通讯函数,可是照手册上说的及你的写法。实际上是对$fp进行数据请求,那第一次都已经执行到$fp的数据尾了,你没再重新对$fp进行赋值或者指针定位,那肯定后面的都读到空值了。
      

  2.   

    fseek和另一个函数是定位指针的,不能用于url.关闭fsockopen打开的指针,再打开,这个办法不是我要的,因为要在一次session会话中完成任务。
      

  3.   

    问题是指针已经到文件尾了,你要么重新读,要么指针定位。
    当 fp 由 fopen() 打开 "http://...." 或是 "ftp://...." 等 URL 文件时,本函数无法作用。也适用与fsockopen吗?我不清楚哦,可能你要试一下。
      

  4.   

    fseek和另一个函数都不行。我试过的。帮帮我。如果实在不行,我就采用遇到\r\n+1的办法来控制指针。
      

  5.   

    代码贴上来最终需要什么结果?我每次读8192字节,直到没有还有啊分太少,呵呵 function f_fsock($website,$url)
    {
    $fp = fsockopen($website, 80, $errno, $errstr, 30);
    if ($fp)
    {
    $out = "GET " . $url . " HTTP/1.1\r\n";
    $out .= "Host: " . $website . "\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    $str = "";
    while (!feof($fp))
    {
    stream_set_timeout($fp, 200);
    $str .= fread($fp, 8192);
    $info = stream_get_meta_data($fp);
    if ($info['timed_out'])
    {
    $str = "";
    break;
    }
    }
    fclose($fp); // 去掉http头
    preg_match("/\r\n\r\n(.+)/is", $str, $out);
    $str = $out[1];
    return $str;
    }
    }
      

  6.   

    "现在要反复请求那个url。"你应该反复调用fsockopen调用一次fsockopen相当于创建一次socket也可以用socket function但是不好控制 function f_socket($website,$url)
    {
    $service_port = getservbyname('www', 'tcp');
    $address = gethostbyname($website);
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    $socket_result = socket_connect($socket, $address, $service_port)) $in = "GET " . $url . " HTTP/1.1\r\n";
    $in .= "Host: " . $website . "\r\n";
    $in .= "Connection: close\r\n\r\n";
    socket_write($socket, $in, strlen($in));
    $str = "";
    do
    {
    if (false === ($out = socket_read($socket, 1024)))
    {
    $str = "";
    break;
    }
    $str .= $out;
    } while ($out != "");
    socket_close($socket);
    return $str;
    }
      

  7.   

    我已经说了,反复调用fsockopen则是进行不同的会话。
    必须保证在一次fsockopen的过程中进行数次请求。while !feof不行才来求助的。
      

  8.   

    这是因为你不了解HTTP协议,HTTP每次连接只能请求一次,请求结束服务器自动关闭连接的,你是不能再做请求的。
      

  9.   

    模拟一次会话,只需处理传来的头部,将session什么的放在下次请求的头里即可。
    我已经似乎解决了这个问题。测试本地的apache服务器没有问题,正在处理细节。
      

  10.   

    http协议我的确不了解,我只是想模拟一次浏览器和服务器的会话过程,谢谢各位兄弟。
      

  11.   

    这是因为你不了解HTTP协议,HTTP每次连接只能请求一次,请求结束服务器自动关闭连接的,你是不能再做请求的。---------
    再做请求是没有任何问题的。在请求的头里将Connection设置为keep-alive即可。
    -----------------
    头大了。有部分服务器可以正确地得到数据了,比如google,csdn。然而winzheng.com的,baidu的都不行。
    ----------------------------------
    我的解决思路是。用fgets得到响应的头部,从头部中取得当前返回的字节数a。
    根据这个数字a/4096得到循环次数n,用fread请求n次,a%4096得到余数mb,用fread请求mb个字节。
    最后用fread请求7个字节。这7个字节我认为是服务器返回的终结字符,是我反复测试得到的。
    这样做的结果是google和我本地的服务器以及csdn都可以正确地得到数据。
    bbs.winzheng.com和baidu的都不行。