php socket如何连续接收多个tcp包

解决方案 »

  1.   

    一个tcp包只有1.4k左右(有说新版协议中可达64k),socket本身就是对tcp包连续操作了
    底层协议不需要考虑,况且在php层面你也触碰不到
      

  2.   

    可是如果服务器连续发送3个以上的包,用php写客户端只接受到返回的前两个包。就收不到后面的包
      

  3.   

    <?php
        $fp = stream_socket_client("tcp://192.168.0.154:4567", $errno, $errstr, 15);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
       // fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
        //while (!feof($fp)) {
          //  echo fgets($fp, 1024);
        //}
        //fclose($fp);
    /*$out = "GET / HTTP/1.1\r\n";
        $out .= "Host: www.example.com2\r\n";
        $out .= "Connection: Close\r\n\r\n";*/

    $usVer=1;           //版本
    $usMajorComm=34;     //主命令
    $usMinorComm=4;     //次命令
    $usDataLen; $uPushID=1123;
    $uAppID=123;
    $usClientIDNum=100;
    $usExpireTime=7200;
    $usMsgLen=123;
    //$char='asdf';
        
    $SPushCommandStruct=pack("L2S3",$uPushID,$uAppID,$usClientIDNum,$usExpireTime,$usMsgLen);
    //$out=pack("V",$uPushID);

    $usDataLen=strlen($SPushCommandStruct);
    echo $usDataLen;
    $SCommHdrStruct=pack('S4',$usVer,$usMajorComm,$usMinorComm,$usDataLen);
    $out=$SCommHdrStruct;
    $outlen=strlen($out);
        fwrite($fp,$out,$outlen);    stream_set_timeout($fp, 15);for($i=0;$i<4;$i++)
    {
    stream_set_blocking($fp,1);
    echo $i;
    echo "<br/>";
       $res=fread($fp,16);
       echo strlen( $res );
       $res3=unpack("SusVer/SusMajorComm/SusMinorComm/SusDataLen",$res);
       var_dump($res3);
       stream_set_blocking($fp,0);
    }
     
        fclose($fp);
    }服务器上原包返回4个
      

  4.   

    你一次读16个字节,4次供64个字节。这只是一个tcp包的内容,哪来的4个包?tcp 在传输前会等待后续数据数据直到缓冲区慢或数据结束,然后才发送