non-blocking приводит к пустым данным.

tristram

Guest
non-blocking приводит к пустым данным.

сначала мой icq-клиент работал по принципу: получил данные, обработал, получил следущие. Но, теперь задачи сложнее и возникла необходимость создания очереди пакетов. Для этого требуются не блокирующие сокеты, написал
PHP:
/...
socket_set_blocking($this->socket,false);
//...
socket_set_timeout($this->socket,0,300 000);
//...
т.е. говорим что не нужно ждать данные вечно а всего лишь например, 300 000 микросекунд (0.3 сек)

сразу же ругается на то что данные из сокета не получены, ставил 30 секунд - всё равно.

winxpsp2, denver, php 4.3.6

что не так? спасибо заранее.

-~{}~ 21.07.05 04:14:

P.S. при включении блокирования сразу данные приходят естественно.

-~{}~ 21.07.05 04:18:

P.P.S кажись не ставится таймаут, т.к. делаю sleep(1); после коннекта до чтения данных и данные приходят :) добрые люди, поскажите как заюзать костыль: как в винде слип сделать на n микросекунд?
 

Screjet

Новичок
В ПХП есть спец. ф-ция socket_select(), которая совмещает в себе ожидание таймаута и ожидание события на нескольких розеток.
 

Screjet

Новичок
ман почитай для ф-ции и примеры использования посмотри в пользовательских примечаниях.
 

tristram

Guest
хм... розетка та у меня одна. ну только ждать данные n микросек и всё.
 

Screjet

Новичок
эхх..
PHP:
function wait_socket( $socket, $sec, $usec ){
  $read = array($socket);
  $write = $except = NULL;
  $num_s = socket_select($read, $write, $except, $sec, $usec);
  if ( $num_s === false ){
    trigger_error("Return error..", E_USER_ERROR);
  } elseif ( $num_s ){
    return true;
  } else {
    return false;
  }
}

//...

if ( wait_socket($socket, 0, 250000) ){
  //..читаем
} else {
  //..таймаут
}
 
Сверху