Титла: Socket_select() && php
Публикувано от: PAIN1 в May 05, 2006, 23:46
От няколко часа се боря и когато си мисля, че знам какво прави се оказва, че не знам или някъде другаде пропускам нещо. Та какво точно прави socket_select() ? От това което разбрах той връща някаква положителна стойност ако има активност на някой от сокетите(на които слуша или които са свързани?). Тоест ако върне някаква true стойност, трябва да проверя всички сокети, тоест да видя дали на слушащия ще ми приеме socket_accept без ерор или да опитам socket_read на останалите ? Попаднах на един 2 примера, 95% идентични, но нещо не можах да им разбера идеята, опитах се и аз напиша един, но уви и той не работи.
Титла: Socket_select() && php
Публикувано от: PAIN1 в May 06, 2006, 17:09
Ще копирам пример който съм взел от http://www.zend.com/pecl/tutorials/sockets.php?article=socketsПримерен код | <?php // Set time limit to indefinite execution set_time_limit (0);
// Set the ip and port we will listen on $address = '10.3.0.40'; $port = 9008; $max_clients = 10;
// Array that will hold client information $clients = Array();
// Create a TCP Stream socket $sock = socket_create(AF_INET, SOCK_STREAM, 0); // Bind the socket to an address/port socket_bind($sock, $address, $port) or die('Could not bind to address'); // Start listening for connections socket_listen($sock);
// Loop continuously while (true) { // Setup clients listen socket for reading $read[0] = $sock; for ($i = 0; $i < $max_clients; $i++) { if ($client[$i]['sock'] != null) $read[$i + 1] = $client[$i]['sock']; } // Set up a blocking call to socket_select() $ready = socket_select($read,$w=null,$e=null,null); /* if a new connection is being made add it to the client array */ if (in_array($sock, $read)) { for ($i = 0; $i < $max_clients; $i++) { if ($client[$i]['sock'] == null) { $client[$i]['sock'] = socket_accept($sock); break; } elseif ($i == $max_clients - 1) print ("too many clients"); } if (--$ready <= 0) continue; } // end if in_array // If a client is trying to write - handle it now for ($i = 0; $i < $max_clients; $i++) // for each client { if (in_array($client[$i]['sock'] , $read)) { $input = socket_read($client[$i]['sock'] , 1024); if ($input == null) { // // Zero length string meaning disconnected unset($client[$i]); } $n = trim($input); if ($input == 'exit') { // requested disconnect socket_close($client[$i]['sock']); } elseif ($input) { // strip white spaces and write back to user $output = ereg_replace("[ \t\n\r]","",$input).chr(0); socket_write($client[$i]['sock'],$output); } } else { // Close the socket socket_close($client[$i]['sock']); unset($client[$i]); } } } // end while // Close the master sockets socket_close($sock); ?>
|
Трябва да поема до 10 клиента и да подържа разговора докато пишат. Хора могат да се конектват, но ако единия напише нещо, другите ги дисконектва. Някой ще го погледне ли да обясни какво става ?
Титла: Socket_select() && php
Публикувано от: PAIN1 в May 09, 2006, 14:36
Разковничето се крие в set_block и set_nonblock , бях забравил за този вариант. Интересното е, че това не е първия път в който попадам на бъгав код от интернет в статии, писани с цел да дадат светлина по проблем.
|