Italian (B4A) - Ping di un indirizzo IP

Sabotto

Active Member
Licensed User
Buonasera
Come posso pingare un indirizzo IP con B4A?
Ho trovato solo esempi con la shell di ping
Penso che dovrei usare un HttpCient, credo, ma non sono riuscitoa capire come
A me basta sapere che posso raggiungere quell'indirizzo (e quindi il router dall'altra parte è OK)
Sono indirizzi Pubblici Statici
Grazie
 

MarcoRome

Expert
Licensed User
Longtime User
Hai 2 strade....
B4X:
 'Richiesta Phone Library
   Dim p As Phone
   'Ping Google DNS
   Wait For (p.ShellAsync("ping", Array As String("-c", "1", "8.8.8.8"))) Complete (Success As Boolean, ExitValue As Int, StdOut As String, StdErr As String)
   If StdErr = "" And StdOut.Contains("Destination Host Unreachable")=False Then
       'OK Server UP
   Else
      'NO Server Down
   End If

B4X:
'Monitorizza Internet
    Dim j As HttpJob
    j.Initialize("", Me)
    j.GetRequest.Timeout = 2000
    j.Download("https://8.8.8.8")
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        'OK Server UP
    Else
        'NO Server Down
    End If
    j.Release
 

Sabotto

Active Member
Licensed User
Ho provato la soluzione con HttpJob, ma il log mi segnala questo
ResponseError. Reason: java.net.UnknownServiceException: CLEARTEXT communication to 94.101.60.12 not permitted by network security policy, Response:
e il test quindi restituisce sempre "non raggiungibile"

B4X:
Dim j As HttpJob
    j.Initialize("", Me)
    j.GetRequest.Timeout = 2000
    j.Download("http://" & "94.101.60.12") ' è reale puoi testarlo se  vuoi'
    Wait For (j) JobDone(j As HttpJob)
    If j.Success Then
        Log("IP raggiungibile")
    Else
        Log("IP NON raggiungibile")
    End If
    j.Release
 

Sagenut

Expert
Licensed User
Longtime User
E' perchè cerchi di raggiungere un protocollo HTTP.
Ora sono ammessi solo gli HTTPS di base.
O cambi sito oppure aggiungi questo al Manifest:
SetApplicationAttribute(android:usesCleartextTraffic, "true")
 

Sabotto

Active Member
Licensed User
...oppure aggiungi questo al Manifest:

Perfetto, grazie. Ora con gli IP pubblici funziona.

Vorrei però testare anche alcuni indirizzi di una VPN (nella quale prima di lanciare la app entro)
Sono del tipo "172.16.0.12". Con il sistema di cui sopra però non funziona perchè giustamente si aspetta http o https e infatti mi restituisce
java.lang.IllegalArgumentException: Expected URL scheme 'http' or 'https' but no colon was found
ed ho usato il metodo con il ping, il primo suggeritomi da MarcoRome.
Ma, mi chiedevo, se potevo usare questo stesso metodo anche per questo tipo di IP, cambiando o impostando qualcosa in maniera diversa?
 

sirjo66

Well-Known Member
Licensed User
Longtime User
nel codice che hai postato io non vedo una chiamata ping ma una chiamata http che si aspetta quindi di risposta una pagina html, ma se il router non ti permette questa cosa è normale che non ti risponda, ma non vuol dire che l'ip non è raggiungibile
 

Sabotto

Active Member
Licensed User
Mi sono espresso male.
Volevo dire che con la chiamata http riesco ad ottenere risposta dagli ip pubblici che "chiamo"
B4X:
    j.GetRequest.Timeout = 2000
    j.Download("http://" & "94.101.60.12")
    Wait For (j) JobDone(j As HttpJob)
Se invece devo testare la risposta di alcuni IP privati (interni ad una VPN), devo farlo con il ping e otengo risposta.
B4X:
Wait For (p.ShellAsync("ping", Array As String("-c", "1", "172.16.0.12"))) Complete (Success As Boolean, ExitValue As Int, StdOut As String, StdErr As String)
Quindi il mio scopo è raggiunto
Volevo solo sapere (non sono esperto, anzi sono abbastanza scarso in tale campo) se potevo testare questi indirizzi IP della VPN con lo stesso metodo che ho usato per quelli pubblici, ma mi sembra di aver capito di no
 

udg

Expert
Licensed User
Longtime User
Nel tuo caso il comando ping ha funzionato perchè il destinatario non ha disabilitato ICMP Echo Reply.
Nell'errore di cui al post #5 ( java.lang.IllegalArgumentException: Expected URL scheme 'http' or 'https' but no colon was found ) sembra che il problema sia l'assenza dei due punti dopo http/https (che sono un protocollo a sé e funzionano se qualcosa è in ascolto sulle porte relative, in genere 80 e 443).
 

Sabotto

Active Member
Licensed User
Nel tuo caso il comando ping ha funzionato perchè il destinatario non ha disabilitato ICMP Echo Reply.
Nell'errore di cui al post #5 ( java.lang.IllegalArgumentException: Expected URL scheme 'http' or 'https' but no colon was found ) sembra che il problema sia l'assenza dei due punti dopo http/https (che sono un protocollo a sé e funzionano se qualcosa è in ascolto sulle porte relative, in genere 80 e 443).
Ciao udg. Non credo sia una questione di sintassi per i due punti. Per gli IP della VPN, solo con il comando "ping" riesco a ricevere risposte.
Se uso il sistema con J.Dowload, non risponde in nessuno dei 3 modi (nei primi due Success non è True, e nella terza dà l'errore a cui ti riferivi)
B4X:
 j.Download("https://" & "172.16.0.12")
 j.Download("http://" & "172.16.0.12")
 j.Download("172.16.0.12")

Ripeto. Ho risolto, come detto, usando il ping ma per mia "semplice curiosità", volevo sapere se era possibile ricevere una risposta anche usando metodo con il Job.
 

drgottjr

Expert
Licensed User
Longtime User
se il server non sta "ascoltando" o sulla porta 80 o sulla porta 443 o una altra porta conosciuta ed indicata nel indirizzo (ess: http://172.16.0.12:3333), la riposta e' no.
la libreria si chiama httputils2. si tratta del protocollo http(s). la porte di base per http(s) sono 80 e 443. (puoi utilizare una altra porta, a partire da porta 1025). apri un server, metti una piccola pagina di benvenuto e prova la tua j.download.
(a proposito, supongo che sai che un indirizzo como 172.16.x.x non e' un "vero" indirizzo de l'internet. non funziona attreverso reti distinte.)
 
Last edited:
Top