Forum Pplware
bug no socket - Versão de Impressão

+- Forum Pplware (http://forum.pplware.com)
+-- Fórum: Mais Tech (/forumdisplay.php?fid=11)
+--- Fórum: Redes (/forumdisplay.php?fid=28)
+--- Tópico: bug no socket (/showthread.php?tid=17376)



bug no socket - dininis - 24-10-2013 11:56

boas, atualmente estou a utilizar este código, do lado do servidor, para gerir a comunicação entre utilizadores (broadcast):
Código:
<?php
    error_reporting(E_ALL);
    set_time_limit(0);
    ob_implicit_flush();
    $address = '127.0.0.1';
    $port = 10000;
    if (($sock=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false)
        echo "socket_create() Falhou: " . socket_strerror(socket_last_error())."\n";
        
    if (socket_bind($sock, $address, $port) === false)
        echo "socket_bind() Falhou: " . socket_strerror(socket_last_error($sock))."\n";
        
    if (socket_listen($sock, 5) === false)
        echo "socket_listen() Falhou: " . socket_strerror(socket_last_error($sock))."\n";

    $clients = array();
    do {
        $read = array();
        $read[] = $sock;
        $read = array_merge($read,$clients);
        
        socket_select($read,$write = NULL, $except = NULL, $tv_sec = 5)
        if (in_array($sock, $read)){
            if (($msgsock = socket_accept($sock)) === false) {
                echo "socket_accept() Falhou: " . socket_strerror(socket_last_error($sock)) . "\n";
                break;
            }
            $clients[] = $msgsock;
            $key = array_keys($clients, $msgsock);
            $msg = "Bem Vindo ao Servidor. \n" .
            "Atualmente é o utilizador {$key[0]}\n";
            socket_write($msgsock, $msg, strlen($msg));
        }
        
        foreach ($clients as $key => $client) {
            if (in_array($client, $read)) {
                if (false === ($MsgRecebida = socket_read($client, 2048, PHP_NORMAL_READ))){
                    echo "socket_read() Falhou: " . socket_strerror(socket_last_error($client)) . "\n";
                    break 2;
                }
                if (trim($MsgRecebida) == 'quit') {
                    unset($clients[$key]);
                    socket_close($client);
                    break;
                }
                if (trim($MsgRecebida) == 'shutdown') {
                    unset($clients[$key]);
                    socket_close($client);
                    socket_close($sock);
                    break 2;
                }
                $talkback = "Cliente ".$key.": ".$MsgRecebida;
                foreach ($clients as $key2 => $client2){
                    socket_write($client2, $talkback, strlen($talkback));
                }
            }
        }
    } while (true);
?>

O problema é que, apesar de estar tudo funcional, a mensagem de retorno que aparece é
Código:
Cliente 0: mensagem
Cliente:

Nem eu nem o meu professor conseguimos resolver essa questão... Ajuda?
Outro problema é que este também não fecha corretamente o socket... a Porta continua a ser associada a um socket que não deveria existir

OBS: Este código é uma adaptação do fornecido pela php.net: http://php.net/manual/pt_BR/sockets.examples.php User:
javier (1 year ago)