2015-08-08 4 views
1

Я использую некоторый API для получения информации о удаленном сервере, отправив пакет с fwrite(), а затем прочитав возвращаемое значение на fread(). В большинстве случаев он работает правильно, но каждые 5-10 раз он возвращает пустую строку с fread(). Это код, я использую:Socket 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() и, кажется, она возвращает количество записанных байт, а не ложные, то есть ошибка была не в fwrite(). Является ли проблема с моим кодом или с сервером, не предоставляющим информацию?

Конструктор открывает сокет, поэтому он не будет отображаться здесь.

ответ

0

Я только что столкнулся с странной ситуацией сокета потока, мой код ошибки всегда возвращал пустую строку.

Я заменил fread на stream_get_contents и проблема решена