Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2014, 09:44   #1
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию Помогите подружиться с socket_select

Здравствуйте, пожалуйста, помогите понять как работает функция 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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эквалайзер...что это? кто это? Можно ли с ним подружиться? .Phoenix Мультимедиа в Delphi 45 08.04.2010 23:37
Не выходит подружиться с функцией... Anohorett Общие вопросы C/C++ 2 25.02.2010 16:18
не могу подружиться с strcat() i-cpp Общие вопросы C/C++ 2 17.02.2010 20:14
Помогите создать програму для роботы с файлами, пожалуйста помогите нужно очень срочно Сергей Человек Фриланс 3 06.07.2009 19:30