Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите подружиться с socket_select 
:(
    Опции темы
lollollollol
Дата 29.3.2014, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Здравствуйте, пожалуйста, помогите понять как работает функция socket_select?


Код

$num_changed = socket_select($read, $write, $except, 0);

Я понял так: в переменную $read помещаем массив ресурсов, созданных и подготовленных сокетов 
Код

                $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
                if ($sock == false) { throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n"); } 
                socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
                if (($ret = socket_bind($sock, $address, $ports)) < 0) { throw new Exception('socket_bind() failed: '.socket_strerror(socket_last_error())."\n");    }
                if (($ret = socket_listen($sock, 20)) < 0) {    throw new Exception('socket_listen() failed: '.socket_strerror(socket_last_error())."\n");    }


После того как функция socket_select будет выполнена, переменная $num_changed будет содержать количество изменённых сокетов. 

А вот дальше слошные вопросы, ответы на которые я не смог найти, начну по порядку:

1. Как работает таймаут? Функция ждёт указанное время, а потом отдаёт результат, или это максимальное время которое ожидает функция изменений в сокете, в случае если изменений нет - вернёт false?

2. Как работают переменные $read, $write, $except, с $read понятно, а вот с $write нет - как функция понимает на какой сокет данные хотят придти, а где ожидают данных?
Или может быть в обе переменные нужно отдавать одинаковые массив, и в котором массиве будет наш сокет, те действия и следует выполнять?

3. При открытии сокета на 2 портах и более, при получении информации что нужно читать сокет ($read) я вызываю socket_accept, если есть значения в переменной $write, тоже нужно его вызывать, или там могут быть значения исключительно уже вызваные socket_accept'ом?

4. Когда на один порт поступает несколько подключений, вызывается множество socket_accept, все они записываются в массив $read, как потом отличить, нужно ли вызывать accept для чтения из них?

5. А как понять на какой порт пришли данные, если допустим у нас по 20 активных подключений с 3-х сокетов?

У меня в голове какая-то каша, возможно я не корректно сформулировал вопрос, прошу внести хоть какую-то ясность в вопросы, заранее спасибо всем кто откликнется!




Это сообщение отредактировал(а) lollollollol - 29.3.2014, 21:03
PM MAIL   Вверх
lollollollol
Дата 30.3.2014, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Ау, программисты, пожалуйста:)
PM MAIL   Вверх
lollollollol
Дата 5.4.2014, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



ап
PM MAIL   Вверх
lollollollol
Дата 8.4.2014, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



ап
PM MAIL   Вверх
numerovan
Дата 26.11.2014, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 549
Регистрация: 1.12.2007

Репутация: 2
Всего: 2



Цитата(lollollollol @  29.3.2014,  20:42 Найти цитируемый пост)

помогите понять как работает функция socket_select?

1. Как работает таймаут? Функция ждёт указанное время, а потом отдаёт результат, или это максимальное время которое ожидает функция изменений в сокете, в случае если изменений нет - вернёт false?

2. Как работают переменные $read, $write, $except, с $read понятно, а вот с $write нет - как функция понимает на какой сокет данные хотят придти, а где ожидают данных?
Или может быть в обе переменные нужно отдавать одинаковые массив, и в котором массиве будет наш сокет, те действия и следует выполнять?


Сижу разбираюсь с этими сокетами, что я сам понял за эти сутки танцев с бубном:

socket_select() - функция следит за изменениями в массиве read в частности, т.е. к примеру подключилось 20 челов, сидят они и ни чего не делаю, потом один из них решил что-то написать, послал запрос ... теперь из 20 значений в массиве read получается только 1 значение ... я вроде пока так это понял, хотя только что проверил это.
По поводу таймаута socket_select($streams, $write = NULL, $except = NULL, SLEEP_TIME_SECONDS, SLEEP_TIME_MILLISECONDS) ... в общем если в SLEEP_TIME_SECONDS поставить допустим 5, то отдача данных от ф-ии socket_select() будет раз в 5 секунд, следующий параметр как видим с учетом миллисекунд.

По поводу $read, $write, $except ... сам хз, но как-то нужно это понять:
Сокеты массива read будут ожидаться, чтобы просмотреть, становятся ли символы доступными для чтения (точнее, чтобы просмотреть, не будет ли блокировано чтение; ресурс сокета готов также и в end-of-file, и в этом случае socket_read() возвратит строку нулевой длины).
Сокеты из массива write будут ожидаться, чтобы просмотреть, не будет блокировано ли чтение.
Сокеты из массива except ожидаются для исключений.



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1056 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.