Автор Тема: Socket_select() && php  (Прочетена 1209 пъти)

PAIN1

  • Напреднали
  • *****
  • Публикации: 432
    • Профил
Socket_select() && php
« -: May 05, 2006, 23:46 »
От няколко часа се боря и когато си мисля, че знам какво прави се оказва, че не
 знам или някъде другаде пропускам нещо.
Та какво точно прави socket_select() ?
От това което разбрах той връща някаква положителна стойност ако има активност на някой от сокетите(на които слуша или които са свързани?).
Тоест ако върне някаква true стойност, трябва да проверя всички сокети, тоест да видя дали на слушащия ще ми приеме socket_accept без ерор или да опитам socket_read на останалите ?
Попаднах на един 2 примера, 95% идентични, но нещо не можах да им разбера идеята, опитах се и аз напиша един, но уви и той не работи.
Активен

PAIN1

  • Напреднали
  • *****
  • Публикации: 432
    • Профил
Socket_select() && php
« Отговор #1 -: 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 клиента и да подържа разговора докато пишат. Хора могат да се конектват, но ако единия напише нещо, другите ги дисконектва.
Някой ще го погледне ли да обясни какво става ?
Активен

PAIN1

  • Напреднали
  • *****
  • Публикации: 432
    • Профил
Socket_select() && php
« Отговор #2 -: May 09, 2006, 14:36 »
Разковничето се крие в set_block и set_nonblock , бях забравил за този вариант.
Интересното е, че това не е първия път в който попадам на бъгав код от интернет в статии, писани с цел да дадат светлина по проблем.
Активен