Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: creare socket UDP

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    18

    creare socket UDP

    Ciao a tutti!Vi spiego il mio problema,sperando che qualcuno mi possa aiutare

    Allora stò costruendo uno script in php che dovrebbe dirmi se alcune porte sono aperte,più precisamente le UDP..Mi sono documentato e ho trovato la funzione sockopen,l'ho provata impostando il parametro "udp://.........",ma nulla mi dà sempre esito positivo ovvero le porte sono sempre aperte,ma nella realtà non è così..

    Ricercando per la rete ho capito che non è possibile usare la funzione sockopen per l'UDP,in pratica bisognerebbe creare:

    1)un socket sulla porta oggetto da esaminare
    2)mandare un messaggio
    3)aspettare la risposta: i casi sono due l'host risponde mandando un messaggio al pc mittente,l'host non risponde,ovviamente da queste condizioni si deduce se la porta è aperta o no

    Lo script ma non mi funziona non compare nulla!

    <?php
    error_reporting(E_ALL);
    echo "<h2>Connessione UDP </h2>\n";

    $service_port ="4500";

    $address = "localhost";
    /* Crea un socket UDP. */
    $socket = socket_create(AF_INET, SOCK_DGRAM, 0);
    if ($socket < 0) {
    echo "socket_create() fallito: motivo: " . socket_strerror($socket) . "\n";
    } else {
    echo "OK.\n";
    }
    echo "Tentativo di connessione a '$address' sulla porta '$service_port'...";
    $result = socket_connect($socket, $address, $service_port);
    if ($result < 0) {
    echo "socket_connect() fallito.\nMotivo: ($result) " . socket_strerror($result) . "\n";
    } else {
    echo "OK.\n";
    }
    $in = "HEAD / HTTP/1.1\r\n";
    $in .= "Host: localhost\r\n";
    $in .= "Connection: Close\r\n\r\n";
    $out = '';
    echo "Invio HTTP HEAD...";
    socket_write($socket, $in, strlen ($in));
    echo "OK.\n";
    echo "Lettura della risposta:\n\n";
    while ($out = socket_read($socket, 2048)) {
    echo $out;
    }
    echo "Chiusura del socket...";
    socket_close($socket);
    echo "OK.\n\n";
    ?>

    AVETE IDEE SUL PERCHE'??Grazie mille

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Tu non hai la minima idea di quello che stai facendo, vero?

    Comunque, come dobbiamo interpretare la frase "Lo script ma non mi funziona non compare nulla!"?
    Dov'e' che non ti compare nulla? Dove si ferma lo script?

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    18
    Ciao!Il fatto è che facendo partire lo script mi compare una pagina bianca e basta,il comando echo che serve per scrivere non mi riporta nulla sulla pagina

    In teoria ho capito come funziona lo script,crea il socket sulla porta,manda il pacchetto sulla porta,aspetta la risposta epoi chiude il socket..

    Se mi dai qualcge aiuto,io riscriverei tutto dall'inizio

    In linea teoria lo script dovrebbe controllare se una porta UDP e non TCP è aperta su un determinato host!!

    grazie

  4. #4
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Beh, pagina bianca significa errore fatale. Il dettaglio dell'errore lo dovresti trovare nell'error log del tuo server.
    Forse non hai l'estensione socket abilitata?

    cosa ti dice:
    Codice PHP:
    var_dump(function_exists('socket_create')); 
    ?

    Ma ci sono alcuni aspetti da chiarire:
    1. puoi tranquillamente usare fsockopen con udp
    2. non dare per scontato che l'host remoto ti mandi qualche risposta anche se la porta e' aperta. Per capire se e' aperta o no (non conoscendo i commandi accettati dal server), bisogna mandare piu' di una richiesta, e poi cercare di capire se la connessione e' andata in socket timeout, oppure no, indipendentemete dal fatto se il server ti risponde o no.
    Se mandi alcune richieste, e vanno tutte in timeout - la porta e' aperta. Se almeno una non va in timeout - la porta e' chiusa.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    18
    Per prima cosa grazie dell'aiuto!

    Allora mi restituisce un valore true,le socket mi funzionano anche perchè le avevo abilitate nel php.ini quindi tutto ok!

    Per la funzione fsockopen,ho provato ad usarla con il protocollo udp,ma mi restituisce sempre valori veri trova sempre le porte aperte quando in realtà non lo sono!

    Di conseguenza ecco la mia scelta di creare i socket!

    Quindi i passi da creare sono:

    1creo la socket con la porta da esaminare
    2mandare delle rischieste sulla porta se:
    3tutte in timeout=porta aperta
    -anche solo una non in timeout=porta chiusa

    Per creare la socket ok ci sono!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    18
    qualche indicazione??grazieee

  7. #7
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    guarda che chiamare socket_create/socket_connect e' la stessa cosa di fsockopen

    Secondo me hai comunque le idee confuse, e non sai cos'e' l'udp, come funziona, cos'e' una porta aperta, etc.

    Cosa esattamente hai bisogno di fare? Cioe a cosa ti serve controllare una porta udp? Devi scansionare host remoti, o solo localhost? Stai scansionando una porta, o un range? Sai esattamente come funziona al livello network il servizio remoto che dovrebbe risponderti?

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    18
    Beh avevo letto su internet un problema identico al mio

    Se uso fsockopen mi dà sempre esito positivo!Ho bisogno di sapere dato un determinato Host,(ovviamente non in locale) se una determinata porta udp è aperta!Ovviamente non so a priori come funzioni il servizio remoto che dovrà rispondermi!!Ovviamente la porta può essere anche un range di porte,non è detto che sia una sola porta!

    Spulciando sulla rete ho trovato questo script:

    <?php
    if (false == ($socket = @socket_create(AF_INET, SOCK_DGRAM, 0))) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    }

    if (false == (@socket_bind($socket, '127.0.0.1', 5355))) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
    }
    ?>


    Facendolo partire,succede questo:

    se porta aperta=mi restituisce il messaggio"DI NORMA E' CONSENTITO UN SOLO UTILIZZO DI OGNI INDIRIZZO SCOKET/PORTA"(ciò stà ad indicare che in quel momento la porta è in uso da un'altra applicazione di conseguenza è APERTA!)

    se porta chiusa=non mi restituisce nulla semplicemente una pagina bianca

    L'HO PROVATO in locale sul mio pc queste considerazioni sono state frutto di esperimenti!

  9. #9
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Originariamente inviato da Pihpi
    Beh avevo letto su internet un problema identico al mio

    Se uso fsockopen mi dà sempre esito positivo!
    E' normale, l'udp e' un protocollo senza connessione. Anche socket_create/socket_connect ti da sempre esito positivo.

    Ho bisogno di sapere dato un determinato Host,(ovviamente non in locale) se una determinata porta udp è aperta!
    Ovviamente non so a priori come funzioni il servizio remoto che dovrà rispondermi!!Ovviamente la porta può essere anche un range di porte,non è detto che sia una sola porta!
    Ok, probabilmente non puoi. O puoi ma solo in certe condizioni.
    Devi capire alcune cose:
    - Se inizializzi una connessione UDP verso una porta chiusa, il host remoto non e' obbligato a mandarti un messaggio di errore.
    - Se inizializzi una connessione UDP verso una porta aperta, il host remoto non ti deve mandare la risposta di acknowledgment
    - La maggiorparte dei host tuttavia restituisce un pacchetto ICMP port unreachable, ma questo non e' garantito (anzi, probabilmente nella maggiorparte dei casi non funzionera')
    - Sul protocollo UDP non viene garantito ne l'arrivo dei pachetti, ne quello degli errori

    Tutto questo rende difficile e poco veritiero determinare lo stato una porta UDP.
    Il trucco con il timeout di sopra funzionera, ma solo in locale o tra due host senza nessun tipo di router/firewall/nat in mezzo (ci sono naturalmente delle eccezioni, ma se stai facendo una scansione alla cieca, non puoi sapere se si tratta di un eccezione o no). Questo perche' il trucco e' basato sul fatto che l'host invii l'icmp unreachable nel caso della porta chiusa.
    Quindi non puoi sapere se una porta e' chiusa.

    Poi, hai detto che non sai come funziona il servizio in ascolto sulla porta che controlli. Questo significa che non sai che commandi inviargli. Il che vuol dire che anche se tu mandi ad una porta del genere dei pachetti, e la porta e' aperta, il servizio remoto non ti rispondera niente.
    Quindi non potrai neanche avere la certezza che la porta sia aperta.

    Riassumendo tutto: non esiste un segnale chiaro di porta chiusa, e non esiste un segnale chiaro di porta aperta.
    Quindi nelle tue condizioni e' impossibile determinare in modo corretto lo stato di una porta UDP.

    Spulciando sulla rete ho trovato questo script:

    <?php
    if (false == ($socket = @socket_create(AF_INET, SOCK_DGRAM, 0))) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    }

    if (false == (@socket_bind($socket, '127.0.0.1', 5355))) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n";
    }
    ?>


    Facendolo partire,succede questo:

    se porta aperta=mi restituisce il messaggio"DI NORMA E' CONSENTITO UN SOLO UTILIZZO DI OGNI INDIRIZZO SCOKET/PORTA"(ciò stà ad indicare che in quel momento la porta è in uso da un'altra applicazione di conseguenza è APERTA!)

    se porta chiusa=non mi restituisce nulla semplicemente una pagina bianca

    L'HO PROVATO in locale sul mio pc queste considerazioni sono state frutto di esperimenti!
    qui hai confuso ancora di piu' le cose, se ho capito bene, tu cerchi di creare un socket in ascolto, ed e' ovvio che non potrai se la porta e' gia' aperta da un altro processo. Ma questo vale solo per il tuo computer locale. Quando controlli un host remoto, il socket in ascolto lo crei sul tuo, e quindi tutto diventa inutile, perche' non ci sono conflitti di porta tra il tuo e quello remoto.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    18
    quindi è impossibile stabilire se una porta udp è aperta o chiusa?

    Non vi sono quindi altri metodi per capire ciò??

    grazie

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.