несколько соединений к socket серверу - работает только одно

xena_00

Новичок
несколько соединений к socket серверу - работает только одно

Привет!
Есть сокет сервер на php, который должен раздавать данные одновременоо несколькимм клиентам. Клиенты тоже на php.
Проблема в том, что после присоединения первого клиента остальные не могут соединиться - висят пока не обрубишь текущего клиента - тогда подсоединяются. Прикол в том, что если клиентом заюзать telnet, то несколько соединений работают и данные передаются.
Код сервера:

$address = '192.168.0.1';
$port = 8090;
$maxClients=3;

// create socket
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
die ("socket_create() failed: reason: " . socket_strerror($sock) . "\n");
}

if ($ret = socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1) < 0) {
die(socket_strerror(socket_last_error()));
}

if (($ret = socket_bind($sock, $address, $port)) < 0) {
die ("socket_bind() failed: reason: " . socket_strerror($ret) . "\n");
}

if (($ret = socket_listen($sock, 5)) < 0) {
die ("socket_listen() failed: reason: " . socket_strerror($ret) . "\n");
}

$clients=array();

// socket_set_nonblock($sock);
// listen for connections
while (true) {
$read[0]=$sock;
$write=null;

for ($i = 0; $i < $maxClients; $i++) {
if ($clients[$i]['sock'] != null) $write[$i] = $clients[$i]['sock'] ;
}

// Set up a blocking call to socket_select()
$ready = socket_select($read,$write,$e=null,null);
if ($ready === false) {
echo "socket_select() failed, reason: " . socket_strerror(socket_last_error()) . "\n";
}

/* if a new connection is being made add it to the client array
* if sock status changed, then new client connected
*/
if (in_array($sock, $read)) {
for ($i = 0; $i < $maxClients; $i++) {
if ($clients[$i]['sock'] == null) {
// accept new connection
if (($msgsock = @socket_accept($sock)) < 0 ) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
}
$clients[$i]['sock']=$msgsock;
echo "accepted connection\n";
break;
} elseif ($i == $maxClients-1) print ("too many clients, refused\n");
}
if (--$ready <= 0) continue;
}

for ($i=0; $i < $maxClients; $i++) {
if (in_array($clients[$i]['sock'], $write)) {
$msgsock=$clients[$i]['sock'];
$out="from server to $i\n";
socket_write($msgsock, $out, strlen($out));
} else {
// echo "$i not in write\n";
//unset($clients[$i]);
}
}
}
socket_close($sock);

В общем то основа - код из http://www.zend.com/pecl/tutorials/sockets.php
Клеиент:

$fp = fsockopen("192.168.0.1", 8090, $errno, $errstr, 3);
if (!$fp) die ("dont open");
ob_end_flush();

while (!feof($fp)) {
ob_start();
echo fread($fp, 16384);
ob_end_flush();
}

fclose($fp);

Т.е. получается, что socket_select не отрабатывает при подключении следующего клиента.. В чем может быть проблемма, совсем не въеду. И почему несколько telnetов работают и подключаются?

Игорь Сажнев

-~{}~ 17.05.06 14:05:

Вот, небольшое уточнение.. 2 php клиент не присоединяется под апачем, если запускать через cli - Все соединяется и работает.
Ничего не понимаю :( Помогите плиз!
 

WP

^_^
У меня тоже socket_select странно работает, пришлось workaround писать через ж.
 

xena_00

Новичок
Попробовал на php 4.4.2 - в cli опять все работает, через модуль апача - нет.. такое ощущение, что где-то стоит ограничение на кол-во соединений .. или блокируется где то подключение нового клиента при уже существующем..
У меня тоже socket_select странно работает, пришлось workaround писать через ж.
А какого рода workaround если не секрет?
 
Сверху