我想用 socket_read  方法来获取整个包的内容,用的代码是
while ( ($sRead= socket_read ( $sockHttp, 2048 ))) {
$this->sResponse .= $sRead;
}
可是程序运行到这里的时候就卡在这里没有反应了,好象是死循环了,不知是什么原因,还请大家帮帮忙,谢谢!

解决方案 »

  1.   

    要改成这样,否则一直可以读到socket的数据,变成了死循环
    while( $sRead = socket_reag( $sockHttp, 2048, PHP_NORMAL_READ) ){
        $this->sResponse .= $sRead;
    }
      

  2.   

    socket_read
    (PHP的4> = 4.1.0,PHP 5中)socket_read - 从套接字读取一个最大长度字节
    描述
    字符串socket_read(资源插座,诠释长度[,int类型])
    该函数socket_read()读取套接字资源的socket_create()或socket_accept()函数创建套接字。在读取的最大字节数由参数指定的长度。否则,你可以使用\ r,\ n或\ 0结束阅读(取决于类型参数,见下文)。socket_read()返回作为一个成功的,或错误假字符串(包括数据,如果远程主机关闭了连接)。错误代码可以检索与socket_last_error()。此代码可以被传递到socket_strerror()来得到一个错误的文字表述。注:socket_read()返回一个零长度字符串(“”)时,有没有更多的数据读取。可选的类型参数是一个命名的常数:
    PHP_BINARY_READ - 使用系统recv()函数。用于读取二进制数据的安全。 (在PHP>“默认= 4.1.0)PHP_NORMAL_READ - 读停在\ n或\河(在PHP <= 4.0.6默认)
      

  3.   

    是真的吗?默认是PHP_BINARY_READ,为什么不行?
      

  4.   

    可以贴一下相关的Demo代码吗?
      

  5.   

    lz 我已经解决了可以在接收字符串的时候加验证.我的码 while(true){
    if(($clientSock = socket_accept($socket))  < 0){
    continue;
    }
    echo "Client Connect\n";

    $data = "";
    do{
    $buf = @socket_read($clientSock, 1024, PHP_NORMAL_READ);
    if(!$buf){ break; }

    $data.=$buf;
    if(trim($buf) == "Shut"){break 2;}
    if(substr($buf, -2) == "\n"){ break;}
    }while(true);


    echo "Client said: $data";
    }
      

  6.   

    就是判断结尾. 或者加指令判断之类的 . 不然会被socket_read阻塞住