Socket fread()有时会返回一个空字符串

时间:2015-08-08 15:23:23

标签: php sockets

我使用某些API通过发送包含fwrite()的数据包来获取远程服务器的信息,然后按fread()读取返回的值。大部分时间它都能正常工作,但每5到10次,它将从fread()返回一个空字符串。这是我使用的代码:

public function getInfo()
{
    @fwrite($this->rSocket, $this->createPacket('i'));

    $inforead = fread($this->rSocket, 999);

    if(strlen($inforead) >= 28)
    {
        $inforead = substr($inforead, 11);

        $aDetails['password'] = (integer) ord(substr($inforead, 0, 1));

        $aDetails['players'] = (integer) $this->toInteger(substr($inforead, 1, 2));

        $aDetails['maxplayers'] = (integer) $this->toInteger(substr($inforead, 3, 2));

        $inforead = substr($inforead, 5);

        $iStrlen = ord(substr($inforead, 0, 4));
        if(!$iStrlen) return -1;
        $aDetails['hostname'] = (string) substr($inforead, 4, $iStrlen);
        $inforead = substr($inforead, 4+$iStrlen);

        $iStrlen = ord(substr($inforead, 0, 4));
        $aDetails['gamemode'] = (string) substr($inforead, 4, $iStrlen);
        $inforead = substr($inforead, 4+$iStrlen);

        $iStrlen = ord(substr($inforead, 0, 4));
        $aDetails['mapname'] = (string) substr($inforead, 4, $iStrlen);
    }
    return $aDetails;
}

我还调试了fwrite(),它似乎返回写入的字节数而不是false,这意味着错误不在fwrite()中。我的代码或服务器的问题是否无法提供信息?

构造函数打开套接字,因此在这里不可见。

1 个答案:

答案 0 :(得分:0)

我刚刚遇到一个奇怪的流套接字情况,我的fread代码总是返回空字符串。

我用stream_get_contents替换了fread并解决了问题