Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    loop inaspettato su socket accept

    Salve, ho un errore su un socket accept:
    la sintassi come da sito php.net dovrebbe essere:
    resource socket_accept ( resource $socket ), quindi => socket_accept($socket).
    Ho fatto prove leggendo socket dal sito di google e funziona, il problema si manifesta sulle mie due pagien: la pagina client e quella server. Queste non hanno apparentemente problemi strutturali, visto che non c'è bisogno neanche di richiamare funzioni troppe funzioni nella apgina client, il problema invece si manifesta nella pagina server:

    Codice PHP:
    <?php
            set_time_limit
    (0);

    $socket socket_create(AF_INETSOCK_STREAMSOL_TCP) or die("Could not create socket\n");

    //questo l'ho visto su php.net, se metto il classico ($socket, $host, $porta) non funziona e mi dà errore, scritto così invece funziona.

             
    $sourceips['kevin'] = '127.0.0.1';
            
    $result socket_bind($socket$sourceips['kevin']) or die("Could not bind to socket\n");
            echo 
    'Risultato bind: '.$result;
            echo 
    '
    '
    ;

            
    $result socket_listen($socket3) or die("Could not set up socket listener\n");
            echo 
    'Risultato listen: '.$result;

    $accetta socket_accept($socket) or die("Could not accept incoming connection\n");
    I vari if mi sono stati consigliati da un amico, per capire dove fosse il problema, e mettendo gli ordini uno ad uno, la pagina si blocca solo su accept. Per gli altri scritti in valore booleano restituisce 1, quindi non ci sono problemi.
    Se qualcuno può magari copiare lo script e provarlo noterà che và in loop su socket_accept, se lo levate la pagina carica senza problemi; essendo però una apgina server.php mi serve quell'accept, provatela e fatemi sapere se dà gli stessi problemi anche a voi e se avete lo stesso problema.

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Cosa intendi che ti va in loop?

    Spero che tu sappia che la accept è bloccante: lo script rimane li bloccato finchè non avviene una connessione

  3. #3
    Quindi dovrei aggiungere un socket_connect?
    Codice PHP:
    <?php
           
    // set some variables

    //    $spawn = array();
        
            
    $host "127.0.0.1";

            
    $port "80";

            
    // don't timeout!

            
    set_time_limit(0);

            
    // create socket

            
    $socket socket_create(AF_INETSOCK_STREAMSOL_TCP) or die("Could not create socket\n");


            
    // bind socket to port

            
    $sourceips['kevin'] = '127.0.0.1';

            
    $sourceips['madcoder'] = '127.0.0.2';
            
            
    // Bind degli indirizzi

            
    $result socket_bind($socket$sourceips['madcoder']) or die("Could not bind to socket\n");
            echo 
    'Risultato bind: '.$result;
            echo 
    '
    '
    ;
            
    // start listening for connections
            
            
    $result socket_connect($socket'127.0.0.1'80);
            echo 
    'Risultato connect: '.$result;
            echo 
    '
    '
    ;

            
    socket_getsockname($socket$host$port);
            
            
    $result socket_listen($socket3);
            echo 
    'Risultato listen: '.$result;
            echo 
    '
    '
    ;
            echo 
    "descrizione: " socket_strerror(socket_last_error());
    Il problema qui è che socket_connect causa problemi se usato insieme a socket_listen:

    Risultato listen:
    descrizione: Richiesta di connessione inoltrata ad un socket già connesso.

    Se "Risultato listen:" non restituisce nè 0, nè 1 come valori vuol dire che non funziona propio, e con " socket_strerror(socket_last_error())" ottengo l'ultimo erroer segnalato.
    Visto che non ho in uso altre pagine che agiscono sui socket, perchè stò usando solo questa che dà problemi al momento, non sò da dove prende le alte richieste, ma levando socket_connect dà l'errore di prima, quindi deduco che non si faccia cos' magari....
    Se ho capito male dimmelo subito per favore.

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Non facciamo confusione. Come server quello che avevi scritto andava bene (a parte che forse dovresti specificare la porta).
    la connect la devi usare nel client per connetterti al socket del server

    Il problema è che il server non lo dovresti usare come una normale pagina, da chiamare da browser.
    Come ti ho detto la accept è bloccante, quindi lo script resta in attesa che un client si connetta. Fino ad allora lo script resta fermo e chiaramente non invia niente al browser.

    Fai una prova. Lancia il server, e poi il client. Se hai fatto tutto bene il server dovrebbe completare il suo lavoro quando il client si connette (a meno che non hai messo qualche loop)

  5. #5
    Risolto, grazie per l'aiuto!

  6. #6
    premesso che, come ti è stato già detto, non devi usare il listen/accept dentro una pagina web, è possibile usare le socket in modalità non bloccante ma il codice ovviamente diventa più complesso perché devi anche gli eventi relativi.

    http://php.net/manual/en/function.so...t-nonblock.php

    (ignora l'avviso che ti dice che la funziona è sperimentale ... c'è da anni ^^)

    nel momento in cui la imposti non bloccante ... OGNI chiamata bloccante ritornerà IMMEDIATAMENTE, anche se non ha completato le operazioni richieste!

    Nel caso di accept, ritornerà immediatamente ... prima di aver "accettato" una connessione in ingresso sia nel caso che ci sia sia nel caso che non ci sia.

    Sotto questo punto di vista viene in soccorso socket_select che può essere usato sia con le socket bloccanti sia con le socket non bloccanti.

    Su php, ma se devo dirla tutta in confronto alle evoluzioni come poll ed epoll è più lento, ma non credo sia un punto che ti interessi visto che la pagina è in php

    http://www.php.net/manual/en/function.socket-select.php

    ma soprattutto qua
    http://www.php.net/manual/en/functio...lect.php#56241

    che mostra un utilizzo CORRETTO di select che può essere facilmente convertito all'uso con socket non bloccanti ... se vedi codici strani che usano le socket non bloccanti con socket_accept dentro un loop con una @ davanti o con gli errori disabilitati ... buttali istantaneamente ... non è il modo corretto di usare le socket non bloccanti!
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.