Я использую некоторый 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()
. Является ли проблема с моим кодом или с сервером, не предоставляющим информацию?
Конструктор открывает сокет, поэтому он не будет отображаться здесь.