SETo
Новичок
socket_select возращает в $read больше сокетов чем произошло соединений
Помогите разобратся с сокетами. Какая-то странная проблема у меня тут, которая для кого-то может оказатся знакомой.
Вообще это все для теста, чтоб разобратся. Создаю 10 сокетов и жду подключения. Подключаюсь по телнету на любой из них. После соединения я должен увидеть BINGO, сокет должен закрытся и соединение сбросится но скрипт будет продолжать работать пока все сокеты не закроются. Я почему-то решил назвать массив сокетов пулом (может оно так и на самом деле называется) и описал простенький класс для манипуляций с ним если понадобится я могу выложить код но пока не вижу в этом смысла.
А вот основной код:
И это все работает вовсе не так как предполагается. Когда происходит соединение телнетом на любой из портов, socket_select возращает кол-во изменившихся сокетов - ровно один, как и должно, ведь соединение одно. Однако в $read и $write лежат все все сокеты пула. Хотя предполагается что врайт будет пуст, а рид будет содержать лиш один сокет. Почему же так происходит?
Вот вывод в браузер.
Помогите разобратся с сокетами. Какая-то странная проблема у меня тут, которая для кого-то может оказатся знакомой.
Вообще это все для теста, чтоб разобратся. Создаю 10 сокетов и жду подключения. Подключаюсь по телнету на любой из них. После соединения я должен увидеть BINGO, сокет должен закрытся и соединение сбросится но скрипт будет продолжать работать пока все сокеты не закроются. Я почему-то решил назвать массив сокетов пулом (может оно так и на самом деле называется) и описал простенький класс для манипуляций с ним если понадобится я могу выложить код но пока не вижу в этом смысла.
А вот основной код:
PHP:
$pool = new sockPool;
for($i=0;$i<10;$i++)
{
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, SystemConfig::$ip);
socket_getsockname($socket, $addr, $port);
if (socket_listen($socket, 5) === false) {
echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
return false;
}
else {
socket_set_nonblock($socket);
$pool->add(new sock($socket));
echo _NL . "Opened on $addr $port";
}
}
echo _NL;
print_r($pool->toArray());
do{
$arr = $pool->toArray();
if ($cChangedSockets = socket_select($read = $arr, $write = $arr, $except=null, 1)){
echo _NL . 'Changed sockets: ' . $cChangedSockets . _NL;
print_r($read);
echo "<hr />";
print_r($write);
if (count($read))foreach($read as $socket)
{
if (($msgsock = @socket_accept($socket)) === false) {
echo "socket_accept(" . $socket . ") failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
}
else {
echo _NL . '<h1>BINGO!</h1>';
}
$pool->remove($socket);
}
}
}while (count($pool->toArray()));
Вот вывод в браузер.