Italian [RISOLTO] B4A - Capire se un IP Pubblico è raggiungibile/connesso

Sabotto

Active Member
Licensed User
StarDust ne approfitto.
1) Nell'ultimo test, quello che fallisce perche volutamente farlocco, si ottiene la risposta DOWN ma la finestra dei Logs mi segnala comunque gli errori (java.net.SocketTimeoutException: connect timed out). Si può evitare?
2) Si possono ricevere le risposte nello stesso ordine in cui sono state richieste?; perchè attualmente apaiono nella ListView1 in base a chi termina prima il test.
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
StarDust ne approfitto.
1) Nell'ultimo test, quello che fallisce perche volutamente farlocco, si ottiene la risposta DOWN ma la finestra dei Logs mi segnala comunque gli errori (java.net.SocketTimeoutException: connect timed out). Si può evitare?
2) Si possono ricevere le risposte nello stesso ordine in cui sono state richieste?; perchè attualmente apaiono nella ListView1 in base a chi termina prima il test.
L'errore è segnalato dalla libreria, per eliminarlo devi modificare la libreria network... Io lo sconsiglio. Non mi pare ci sia un modo per disattivare i log della libreria, ma mi potrei sbagliare.

Per la seconda richiesta , appaiono nell'ordine di risposta. Alcuni rispondono subito altri no. Per ottenere lo stesso ordine devi aspettare la risposta del precedente prima di inviarne una successiva.
Questo comporta la modifica del sorgente e farà durare la procedura più tempo perché anziché avvenire contemporaneamente, saranno effettuate con una successione.
 

Star-Dust

Expert
Licensed User
Longtime User
Ecco, appunto, anch'io ho tonnellate di progettini ma proprio per questo; un domani troverai "jSabotto" e saprai subito a cosa serva quel progetto 😄
Certo, Sabotto=RouterPublic_IP_Response
 

Star-Dust

Expert
Licensed User
Longtime User
StarDust ne approfitto.
1) Nell'ultimo test, quello che fallisce perche volutamente farlocco, si ottiene la risposta DOWN ma la finestra dei Logs mi segnala comunque gli errori (java.net.SocketTimeoutException: connect timed out). Si può evitare?
2) Si possono ricevere le risposte nello stesso ordine in cui sono state richieste?; perchè attualmente apaiono nella ListView1 in base a chi termina prima il test.
Adesso sono fuori e non posso modificare il sorgente, ma se metti un wait For dopo ogni richiesta in attesa dell'esito , ti restituirà le risposte nell'ordine di richiesta
 

LucaMs

Expert
Licensed User
Longtime User
Questo comporta la modifica del sorgente e farà durare la procedura più tempo perché anziché avvenire contemporaneamente, saranno effettuate con una successione.
Ehm... premesso che ho una pessima memoria, purtroppo (ma anche il fatto che mi impiccio in ogniddove ha il suo peso)...
ebbi un problema simile se non proprio uguale: dovevo attendere il completamento di due resumable ma non sapevo quale sarebbe durata di più.
Se riuscirò a ritrovare il thread ovviamente posterò il link (oh, sono arrivato alla bellezza di...
1618817838218.png


23.939 post, compreso questo!
 

LucaMs

Expert
Licensed User
Longtime User
Sto iniziando a guardare il sorgente jSabotto.

Sperando che capiate il motivo del mio commento e complimentandomi anticipatamente con @Star-Dust per esso (come scrivo bene, seriosamente e diplomaticamente 😄) vorrei suggerire a lui ed a chiunque faccia diversamente, una cosa che io ritengo una buona scelta, abitudine.

Nel sorgente c'è questa variabile dichiarata a livello di modulo (ovvero nella Class_Globals - privata):
B4X:
Private Con As Socket

E' ovvio che non è possibile dichiararla:
B4X:
Private Socket As Socket

ma chiamandola Con (ma anche Connection) non si veda a colpo d'occhio cosa sia.
In questi casi, se la variabile è "privata a livello di modulo", io prefersco dichiararla:
B4X:
Private mSocket As Socket
così so subito che è a livello di modulo (m) e cosa sia (un Socket).
Se invece fosse pubblica, quindi a livello di progetto, globale:
B4X:
Public gSocket As Socket
in cui il prefisso "g" sta appunto per Global (process).


Poi... fate come ve pare, ovviamente 😄


P.S. Dato che magari conserverò quegli esempi e che voglio cambiare quel nome di variabile, non so se conosciate il modo semplce e sicuro per farlo: premere F7 sul nome della variabile da cambiare e... guardate a destra.
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Con è un acronimo e non un abbreviazione di Connection. Ha un significato specifico per la funzione richiesta.

Check Online Network
oppure
Controll Offline Network
Ma anche
Collector out Network
 

LucaMs

Expert
Licensed User
Longtime User
Con è un acronimo e non un abbreviazione di Connection. Ha un significato specifico per la funzione richiesta
A parte che se ti aspetti cosa significherebbe quell'acronimo stai fresco 😄... tutta quella pappardella era per suggerire due cose:

1 - come poter ovviare al fatto di non poter scrivere "Dim" NomeClasse As NomeClasse (ovvero premettere qualche lettera, un prefisso)
2 - usare un prefisso speciale per variabili dichiarate nella Class_Globals, in modo da vedere subito sia che appunto è stata dichiarata là (non è locale a una routine), sia che che comunque è "visibile" (scope) solo a livello di modulo-classe ("m") oppure di progetto-globale ("g").
 

Star-Dust

Expert
Licensed User
Longtime User
A parte che se ti aspetti cosa significherebbe quell'acronimo stai fresco 😄... tutta quella pappardella era per suggerire due cose:

1 - come poter ovviare al fatto di non poter scrivere "Dim" NomeClasse As NomeClasse (ovvero premettere qualche lettera, un prefisso)
2 - usare un prefisso speciale per variabili dichiarate nella Class_Globals, in modo da vedere subito sia che appunto è stata dichiarata là (non è locale a una routine), sia che che comunque è "visibile" (scope) solo a livello di modulo-classe ("m") oppure di progetto-globale ("g").
Ma se mettiamo ad esempio
B4X:
Dim sdClassName as ClassName
Non sembra molto più meglio assai?
 

Sabotto

Active Member
Licensed User
B4X:
Private mSocket As Socket
così so subito che è a livello di modulo (m) e cosa sia (un Socket).
Si anche io di solito faccio cosi usando proprio la "m"
Adesso sono fuori e non posso modificare il sorgente, ma se metti un wait For dopo ogni richiesta in attesa dell'esito , ti restituirà le risposte nell'ordine di richiesta
Ci avevo provato, ma non essendo bravo, non sono riuscito a capiure come metterlo quel Wait For .... complete..., perche la classe restituisce poi il responso tramite il suo evento "Conected". Dovrei quindi aspettare che tale evento sia scatenato (e che che a sua volta chiama la Sub AddressLive_Result, nella Main) e non sono riuscito a farlo per ora.
 

Star-Dust

Expert
Licensed User
Longtime User
Nn usare in questo caso complete, ma
wait For (evento_risultato(Success As Boolean))

Una cosa del genere
 

Sabotto

Active Member
Licensed User
Nn usare in questo caso complete, ma
wait For (evento_risultato(Success As Boolean))

Una cosa del genere
evento_risultato intendi
B4X:
Sub AddressLive_Result(message as string)
Ho provato a metterla qui (ma enza il Success as Boolean).. ma non funziona giustamente
B4X:
For Each Key As String In AddressMap.Keys
        Dim Live As AddressLive
        Live.Initialize(Me,"AddressLive")
        Live.Start(Key,AddressMap.Get(Key))
        Wait For AddressLive_Result
    Next
Non è urgente... se hai tempo ci guardi. Grazie sempre
 

LucaMs

Expert
Licensed User
Longtime User
B4X:
    ListView1.Items.Clear
    For Each Key As String In AddressMap.Keys
        Dim Live As AddressLive
        Live.Initialize(Me, "AddressLive")
        Live.Start(Key, AddressMap.Get(Key))
        Wait For AddressLive_Result(Message As String)
        ListView1.Items.Add(Message)
    Next

ed elimina:
B4X:
Private Sub AddressLive_Result(Message As String)
    ListView1.Items.Add(Message)
End Sub
 

Star-Dust

Expert
Licensed User
Longtime User
B4X:
ListView1.items.Clear
For Each Key As String In AddressMap.Keys
        Dim Live As AddressLive
        Live.Initialize(Me,"AddressLive")
        Live.Start(Key,AddressMap.Get(Key))
        Wait For AddressLive_Result(message as string)
        ListView1.ltems.Add(Message)
    Next

E devi eliminare la sub
Sub Wait For AddressLive_Result(message as string)
 

Star-Dust

Expert
Licensed User
Longtime User
Flik e flok
 

LucaMs

Expert
Licensed User
Longtime User
B4X:
    ListView1.Items.Clear
    For Each Key As String In AddressMap.Keys
        Dim Live As AddressLive
        Live.Initialize(Me, "AddressLive")
        Live.Start(Key, AddressMap.Get(Key))
        Wait For AddressLive_Result(Message As String)
        ListView1.Items.Add(Message)
    Next

ed elimina:
B4X:
Private Sub AddressLive_Result(Message As String)
    ListView1.Items.Add(Message)
End Sub
B4X:
ListView1.items.Clear
For Each Key As String In AddressMap.Keys
        Dim Live As AddressLive
        Live.Initialize(Me,"AddressLive")
        Live.Start(Key,AddressMap.Get(Key))
        Wait For AddressLive_Result(message as string)
        ListView1.ltems.Add(Message)
    Next

E devi eliminare la sub
Sub Wait For AddressLive_Result(message as string)
Please, do not duplicate posts 😄
 
Top