Дано: php 5.3.23 FreeBSD 8 ser2net подключаюсь к tcp сокету: PHP: $host = '127.0.0.1'; $port = 80; $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp")); if (socket_connect($socket, $host, $port)) { $receiveStr = socket_read($socket, 16, PHP_BINARY_READ); } Если подключаюсь вышеописанным способом, то получаю данные мз сокета не полностью (по всей видимости они не успевают сформироваться) Если делаю: PHP: $host = '127.0.0.1'; $port = 80; $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp")); if (socket_connect($socket, $host, $port)) { sleep(1); $resp = socket_read($socket, 16, PHP_BINARY_READ); } то данные получаю полностью, но скрипт работает слишком медленно. Количество байт в ответе мне заранее известно, оно имеет несколько фиксированных значений, как задать таймаут на ожидание ответа и автоматическое закрытие сокета при получении определённого количества байт одновременно?
$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"; }
А если у меня сокет отдал только, например 5 байт, а Len установлен на 20 , байт, скрипт зхависнет чтоль? Если да, то как установить таймаут на это зависанеие ?
Тогда чем это будет отличаться от изначального варианта? Моя задача: вернуть буфер, сразу, как в нём скопилось n-байт или ожидать таймаута, если n-байт ещё не получено.
? ну как мне кажется, это плохая и как минимум очень не красивая идея... т.е. штатных средств управленя таймаутом на чтение сокета в пхп нет? я лучше поставлю какой-нить usleep.... но это как-то костыльно.....
Что значит плохая идея? Из цикла можно выйти досрочно. А спать скрипт будет отведённое время без вариантов.