Non capisco se invio il socket

  • Creatore Discussione Creatore Discussione PHP
  • Data di inizio Data di inizio

PHP

Utente Attivo
9 Mag 2013
105
0
16
Non capisco se i socket vengono effettivamente inviati, volevo capirne il funzionamento e dopo aver letto qualche guida ho voluto vedere un esempio, ma se l'esempio non funziona non posso capirne ulteriornmente il funzionamento.
Questo esempio era su un sito in italiano (uno dei pochi esempi online sui sockets comprensibili, almeno per me):
PHP:
<?php
//SERVER.PHP

$sock=socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //crea un socket

if(!socket_bind($sock, "127.0.0.1", 443)) //crea un socket sulla porta 1999 localmente

    return; //se non è stato possibile eseguire il binding della riga precedente, termina

socket_listen($sock, 2); //altrimenti, si mette in attesa

while(1) //ciclo infinito: 1 è sempre vero

{

    print ("Connected, now reading...\n"); //scrive “connecte, now ready” e va a capo

    $canale = socket_accept($sock); //accetta la connessione sul socket aperto

    $x = socket_read($canale, 1024, PHP_NORMAL_READ); //legge i dati fino al carattere “\n”

    $dim=strlen($x); //scrive dentro la var dim la lunghezza della stringa passata

    $validCommand=substr($x, 0, $dim-1); //estrae il comando eliminando i caratteri “\n”

    echo "ho ricevuto la stringa: ".$validCommand."\n"; //da conferma  a video della stringa ricevuta

    switch ($validCommand) //analizza la stringa ricevuta

    {

        case "ciao":  //se la stringa vale “ciao”

           echo "ciao a te!\n"; //scrive “ciao a te!” e va a capo

        break;

        case "come stai": //se la stringa vale “come stai”

           echo "bene grazie\n"; //scrive “bene grazie” e va a capo

        break;

        case "exit": // se la stringa vale “exit”

            return; //termina l'applicazione

        break;

        default: //per tutti gli altri valori della stringa non contemplati nelle righe precedenti

        echo "comando sconosciuto!...\n"; //scrive “comando sconosciuto!...” e va a capo

        break;

    }

}
?>

PHP:
<?php
//CLIENT.PHP

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //crea un socket

socket_connect($sock, "127.0.0.1", 443); //si connette in locale sulla porta 1999

$stringa="ciao"; // setta una variabile stringa contenente “ciao”

echo "invio la stringa ".$stringa."\n"; //scrive  che invierà la stringa

socket_write($sock, "$stringa\n"); // invia i dati all'altro programma tramite socket aggiungendo un accapo
?>

I titoli delle pagine sono scritti dopo l'aperura del php e vanno scritti in minuscolo.
Il mio problema è semplicemente che la pagina non fà niente...
Per favore potreste provare ad usarli, ovviamente cambiate la porta per il socket.
Fatemi sapere!!:fonzie:
 
PHP:
<?php 
//SERVER.PHP 

$sock=socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //crea un socket 

if(!socket_bind($sock, "127.0.0.1", 443)) //crea un socket sulla porta 1999 localmente 

    return; //se non è stato possibile eseguire il binding della riga precedente, termina 

socket_listen($sock, 2); //altrimenti, si mette in attesa 

while(1) //ciclo infinito: 1 è sempre vero 

{ 

    print ("Connected, now reading...\n"); //scrive “connecte, now ready” e va a capo 

    $canale = socket_accept($sock); //accetta la connessione sul socket aperto 

    $x = socket_read($canale, 1024, PHP_NORMAL_READ); //legge i dati fino al carattere “\n” 

    $dim=strlen($x); //scrive dentro la var dim la lunghezza della stringa passata 

    $validCommand=substr($x, 0, $dim-1); //estrae il comando eliminando i caratteri “\n” 

    echo "ho ricevuto la stringa: ".$validCommand."\n"; //da conferma  a video della stringa ricevuta 

    switch ($validCommand) //analizza la stringa ricevuta 

    { 

        case "ciao":  //se la stringa vale “ciao” 

           echo "ciao a te!\n"; //scrive “ciao a te!” e va a capo 

        break; 

        case "come stai": //se la stringa vale “come stai” 

           echo "bene grazie\n"; //scrive “bene grazie” e va a capo 

        break; 

        case "exit": // se la stringa vale “exit” 

            return; //termina l'applicazione 

        break; 

        default: //per tutti gli altri valori della stringa non contemplati nelle righe precedenti 

        echo "comando sconosciuto!...\n"; //scrive “comando sconosciuto!...” e va a capo 

        break; 

    } 

} 
?>

socket_bind($sock, "127.0.0.1", 443) qui non crea un bind alla porta 1999 ma semmai alla porta 443 poi non capisco che senso abbia mettere la condizione se diverso da. In oltra un ciclo infinito non e molto sensato normalmente poi stai utilizzando tutti indirizzi ip locali quindi crei un socket che si connette con se stesso e neanche qui ci vedo molto senso in oltre utilizza un il termine chiave return per teminare una funzione non ho mai sentito una cosa simile penso che non sia un ottimo esempio questo... se ne trovi di meglio postali e fammi sapere ciao
 
In realtà mi interessava solo capirne il funzionamento base, comunque hai ragione. Un problema aggiuntivo è che richiamare la pagina server.php direttamente la fà ciclare all'infinito (credo sia colpa dell'impostazione del ciclo while), inoltre anche se funzionasse teoricamente non potresti personalizzare niente, visto che passa un valore fisso di una variabile al sockets.
Per come è struttturato mi ha ricordato un ipotetico form di registrazione, ad esempio se non metti l'email potrebbe far tornare indietro la frase "inserisci l'email", inutile spreco di codice per una cosa così banale.
Ho cambiato la porta in 433 perchè apache in localhost sul mio computer non accetta la 1999 ma la 433, ecco gli errori della pagina client con la porta 1999:
Codice:
Warning: socket_connect(): unable to connect [0]: Impossibile stabilire la connessione. Rifiuto persistente del computer di destinazione.
invio la stringa ciao
Warning: socket_write(): unable to write to socket [0]: Socket non connesso e indirizzo non fornito durante l'invio su un socket di datagramma che utilizza una chiamata sendto. Richiesta di invio o ricezione di dati annullata.
Comunque cercherò un esempio più valido su internet, questo non era propio il massimo.
 

Discussioni simili