За последние 24 часа нас посетили 53808 программистов и 1765 роботов. Сейчас ищут 1550 программистов ...

socket_read timeout в байтах и секундах.

Тема в разделе "PHP для новичков", создана пользователем NewUse, 27 авг 2018.

  1. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Дано:
    php 5.3.23
    FreeBSD 8
    ser2net

    подключаюсь к tcp сокету:
    PHP:
    1. $host = '127.0.0.1';
    2. $port = 80;
    3. $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp"));
    4. if (socket_connect($socket, $host, $port)) {
    5.     $receiveStr = socket_read($socket, 16, PHP_BINARY_READ);
    6. }
    Если подключаюсь вышеописанным способом, то получаю данные мз сокета не полностью (по всей видимости они не успевают сформироваться)

    Если делаю:

    PHP:
    1. $host = '127.0.0.1';
    2. $port = 80;
    3. $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp"));
    4. if (socket_connect($socket, $host, $port)) {
    5.      sleep(1);
    6.     $resp = socket_read($socket, 16, PHP_BINARY_READ);
    7. }
    то данные получаю полностью, но скрипт работает слишком медленно.

    Количество байт в ответе мне заранее известно, оно имеет несколько фиксированных значений, как задать таймаут на ожидание ответа и автоматическое закрытие сокета при получении определённого количества байт одновременно?
     
  2. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    никаких мыслей? вроде бы достаточно стандартный вопрос....
    просто не знаю куда гуглить.
     
  3. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    $resp = 'Это мой буфер.';
    if (false !== ($bytes = socket_recv($socket, $resp, 20, MSG_WAITALL))) {
    echo "Прочитано $bytes байта из функции socket_recv(). Закрываем сокет...";
    } else {
    echo "Не получилось выполнить socket_recv(); причина: " . socket_strerror(socket_last_error($socket)) . "\n";
    }
     
    NewUse нравится это.
  4. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    А если у меня сокет отдал только, например 5 байт, а Len установлен на 20 , байт, скрипт зхависнет чтоль? Если да, то как установить таймаут на это зависанеие ?
     
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @NewUse, замени на MSG_DONTWAIT, я просто скопипастил
     
  6. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Тогда чем это будет отличаться от изначального варианта?

    Моя задача: вернуть буфер, сразу, как в нём скопилось n-байт или ожидать таймаута, если n-байт ещё не получено.
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    зацикли
     
  8. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    ? ну как мне кажется, это плохая и как минимум очень не красивая идея...
    т.е. штатных средств управленя таймаутом на чтение сокета в пхп нет?

    я лучше поставлю какой-нить usleep....

    но это как-то костыльно.....
     
  9. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Что значит плохая идея? Из цикла можно выйти досрочно. А спать скрипт будет отведённое время без вариантов.