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 - Все соединяется и работает.
Ничего не понимаю
Помогите плиз!
Привет!
Есть сокет сервер на 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 - Все соединяется и работает.
Ничего не понимаю
Помогите плиз!