E' normale, l'udp e' un protocollo senza connessione. Anche socket_create/socket_connect ti da sempre esito positivo.Originariamente inviato da Pihpi
Beh avevo letto su internet un problema identico al mio
Se uso fsockopen mi dà sempre esito positivo!
Ok, probabilmente non puoi. O puoi ma solo in certe condizioni.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!
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.
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.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!

Rispondi quotando