Установите тайм-аут на socket_read

Мне было интересно, как установить тайм-аут на вызов socket_read? При первом вызове socket_read он ожидает, пока данные будут отправлены, и если никакие данные не будут отправлены в течение 5 секунд, я хочу отключить соединение. Любая помощь? Я уже пробовал SO_RCVTIMEO без везения.

Я создаю сокет с socket_create() и слушаю его для соединений, затем при подключении слушаю данные и потом что-то делаю с ним. Когда хиты таймаута, я хочу запустить socket_shutdown(), а затем socket_close().

Ответ 1

Я сделал socket_listen, а затем сделал ручной тайм-аут со временем() + 2 и цикл while с неблокированным набором и socket_read() внутри. Кажется, работает нормально. Любые альтернативы?

UPDATE: я обнаружил, что установка сокета как неблокирующего, а затем с помощью socket_listen предоставила необходимый тайм-аут.

Ответ 2

этот набор составляет 5 секунд таймаута сокета.

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));

Ответ 3

Вы пробовали socket_set_option с SO_RCVTIMEO

Значение таймаута для операций ввода.

Ответ 4

$read_socket = socket_select($read, $write  = NULL, $except = NULL, 10); // 10 - Timeout
if($read_socket === FALSE)
    $this->End();
elseif($read_socket === 0)
    return FALSE;

$pdu_ = socket_read($this->session, 102400);
if($read_socket && !strlen($pdu_))
    $this->End();