сокеты — PHP unread_bytes работает в PHP 5.3, но не в PHP 5.4

У меня проблема с подключением к telnet-серверу с использованием PHP-сокетов. Я закончил класс telnet, но на моем другом сервере этот класс не работал из-за значения unread_bytes stream_get_meta_data. PHP изменил это в версии 5.4? Я не могу найти что насчет этого изменения.

Код, который я использую:

        $buff = '';
while (!feof($this->socket)) {
$buff .= fread($this->socket, 1024);
$stream_meta_data = stream_get_meta_data($this->socket);
if ($stream_meta_data['unread_bytes'] <= 0)
break;
}

Кто-нибудь может мне помочь или сказать мне, что я могу изменить?

0

Решение

Вы не четко указали, что должен делать ваш фрагмент кода:

  1. читать байты, пока соединение с сокетом не будет закрыто, или
  2. читать байты, которые доступны в данный момент, на живом соединении.

Но твой комментарий feof () не работает правильно предполагает, что вы после 2., так как feof() проверки будет достаточно для 1 .; ср комментарий от Wez к «Не ошибка» unread_bytes всегда 0:

unread_bytes — это количество байтов, оставшихся на уровне буферизации PHP.
после последнего прочтения.
Если вы использовали все данные из буфера
при предыдущем чтении, unread_bytes будет оставаться на нуле до следующего чтения
кусок данных из сети.
Таким образом, unread_bytes не должно быть
используется, чтобы определить, ожидают ли больше данных; Вы должны использовать либо:

  • feof () для определения конца файла.
    Не забывай что ты
    Здесь можно использовать неблокирующий режим.
  • В PHP 4.3 появилась новая функция
    называется stream_select (), который ведет себя как socket_select () из
    расширение сокетов, но работает на всех файлах, возвращаемых fopen () и
    fsockopen (). Вы можете использовать его, чтобы проверить, какие файлы готовы для
    чтение / запись, а также указать время ожидания.
  • Итак, если вы хотите 2., вы можете использовать stream_select() или же socket_select(),

    0

    Другие решения

    Других решений пока нет …

    По вопросам рекламы [email protected]