Italian Test IP con socket - Solo il primo risponde

Sabotto

Active Member
Licensed User
Prendendo spunto da un codice suggeritomi (da StarDust) testo la risposta di alcuni IP Pubblici
Ora però mi sta capitando che solo il primo risponde (qualunque io scelga come primo da testare). I successivi no.
Non riesco a capire cosa diavolo può essere (prima funzionava). Ho fatto molte prove ma non riesco a capire perche solo la prima riga funziona e le altre restituiscono False al test.
Allego pezzo "incirminato" e un progettino con il minimo indispensabile per riprodurre il problema nel caso servisse
B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
   
    Dim oConn As clsConnessione
           
End Sub

Public Sub Initialize
   
End Sub

Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    'Root.LoadLayout("MainPage")
   
    oConn.Initialize
           
End Sub

Private Sub Button1_Click
   
' Risponde 'True' solo il primo test. Se remmo il primo, risponde true solo il secondo test.... e cosi via
    wait for (oConn.ConnessioneSocket("http://185.104.124.17")) complete (EsitoRisp As Boolean)
    Log("esito test 1" & "  " & EsitoRisp)
    wait for (oConn.ConnessioneSocket("https://195.60.191.158")) complete (EsitoRisp As Boolean)
    Log("esito test 2" & "  " & EsitoRisp)
    wait for (oConn.ConnessioneSocket("http://195.60.191.193:8080")) complete (EsitoRisp As Boolean)
    Log("esito test 3" & "  " & EsitoRisp)
    wait for (oConn.ConnessioneSocket("http://285.104.124.17")) complete (EsitoRisp As Boolean)
    Log("esito test 4" & "  " & EsitoRisp)
   
End Sub

'Nella classe clsConnessione

Public Sub ConnessioneSocket(IndirizzoCompleto As String)As ResumableSub
       
    Ricava_IP_Porta (IndirizzoCompleto)
   
    Try
        'Metodo Connect del socket mSocket; viene chiamato con IP, mPorta e TimeOut
        'Prova a connettersi ad un dato indirizzo. La connessione avviene in background.
        'Quando la connessione è terminata o è fallita, viene scatenato l'evento "Connected"
        mSocket.Connect(mSoloIP,mPorta,3000)
        wait for mSocket_Connected (Successful As Boolean)
       
        Return Successful
    Catch
        Error=LastException.Message
        Return False
    End Try

End Sub
Lanciandolo si ottiene
esito test 1 true
esito test 2 false
esito test 3 false
esito test 4 false

'remmando il primo wait for
esito test 2 true
esito test 3 false
esito test 4 false
 

Attachments

  • Test_IP_Prova.zip
    10 KB · Views: 120

Lello1964

Well-Known Member
Licensed User
Longtime User
Prova a chiudere il socket e inizializzarlo di nuovo, funziona.

B4X:
Private Sub Button1_Click
    wait for (oConn.ConnessioneSocket("http://285.104.124.17")) complete (EsitoRisp4 As Boolean)
    Log("esito test 4" & "  " & EsitoRisp4)
   
    oConn.chiudiSocket
    wait for (oConn.ConnessioneSocket("https://195.60.191.158")) complete (EsitoRisp As Boolean)
    Log("esito test 2" & "  " & EsitoRisp)
   
    oConn.chiudiSocket
    wait for (oConn.ConnessioneSocket("http://185.104.124.17")) complete (EsitoRisp1 As Boolean)
    Log("esito test 1" & "  " & EsitoRisp1)
   
    oConn.chiudiSocket
    wait for (oConn.ConnessioneSocket("http://195.60.191.193:8080")) complete (EsitoRisp2 As Boolean)
    Log("esito test 3" & "  " & EsitoRisp2)

End Sub

B4X:
Sub Class_Globals
    Private mSocket As Socket        'Il socket (libreria Network)
    Private mSoloIP As String        'IP (solo numeri, senza http(s) e senza mPorta
    Private mPorta As Int            'mPorta (80, 443 o quella che c'è)
    Public Error As String = ""
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize()
    mSocket.Initialize("mSocket")
End Sub

Public Sub ConnessioneSocket(IndirizzoCompleto As String)As ResumableSub
       
    Ricava_IP_Porta (IndirizzoCompleto)
   
    Try
        'Metodo Connect del socket mSocket; viene chiamato con IP, mPorta e TimeOut
        'Prova a connettersi ad un dato indirizzo. La connessione avviene in background.
        'Quando la connessione è terminata o è fallita, viene scatenato l'evento "Connected"
        mSocket.Connect(mSoloIP,mPorta,3000)
        wait for mSocket_Connected (Successful As Boolean)
   
        Return Successful
    Catch
        Error=LastException.Message
        Return False
    End Try

End Sub


Sub Ricava_IP_Porta(IndirizzoCompleto As String)
   
    'Pone in mSoloIP solo l'indirizzo senza protocollo http o https
    'e in mPorta solo la Porta (80, 443 o quella che gia c'è)
   
    'Se nell'IP non c'è la Porta finale
    If IndirizzoCompleto.LastIndexOf(":")<6 Then
        'la mette lui di default (80 per http e 443 per https)
        If IndirizzoCompleto.ToLowerCase.StartsWith("https") Then mPorta=443 Else mPorta=80
        mSoloIP=IndirizzoCompleto
    Else
        'se invece la mPorta c'è, la legge
        mPorta=IndirizzoCompleto.SubString(IndirizzoCompleto.LastIndexOf(":")+1)
        'e memorizza mSoloIP (senza la mPorta finale)
        mSoloIP=IndirizzoCompleto.SubString2(0,IndirizzoCompleto.LastIndexOf(":"))
    End If
    'qui si libera dell'eventuale protocollo http e https
    mSoloIP=mSoloIP.ToLowerCase.Replace("https://","").Replace("http://","")
End Sub

Sub chiudiSocket
    mSocket.Close   
    mSocket.Initialize("mSocket")
    Log("closed")
End Su

B4X:
esito test 4  true
closed
esito test 2  true
closed
esito test 1  true
closed
esito test 3  true
 

Star-Dust

Expert
Licensed User
Longtime User
Prendendo spunto da un codice suggeritomi (da StarDust) testo la risposta di alcuni IP Pubblici
Ora però mi sta capitando che solo il primo risponde (qualunque io scelga come primo da testare). I successivi no.
Non riesco a capire cosa diavolo può essere (prima funzionava). Ho fatto molte prove ma non riesco a capire perche solo la prima riga funziona e le altre restituiscono False al test.
Allego pezzo "incirminato" e un progettino con il minimo indispensabile per riprodurre il problema nel caso servisse
B4X:
Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI

    Dim oConn As clsConnessione
        
End Sub

Public Sub Initialize

End Sub

Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    'Root.LoadLayout("MainPage")

    oConn.Initialize
        
End Sub

Private Sub Button1_Click

' Risponde 'True' solo il primo test. Se remmo il primo, risponde true solo il secondo test.... e cosi via
    wait for (oConn.ConnessioneSocket("http://185.104.124.17")) complete (EsitoRisp As Boolean)
    Log("esito test 1" & "  " & EsitoRisp)
    wait for (oConn.ConnessioneSocket("https://195.60.191.158")) complete (EsitoRisp As Boolean)
    Log("esito test 2" & "  " & EsitoRisp)
    wait for (oConn.ConnessioneSocket("http://195.60.191.193:8080")) complete (EsitoRisp As Boolean)
    Log("esito test 3" & "  " & EsitoRisp)
    wait for (oConn.ConnessioneSocket("http://285.104.124.17")) complete (EsitoRisp As Boolean)
    Log("esito test 4" & "  " & EsitoRisp)

End Sub

'Nella classe clsConnessione

Public Sub ConnessioneSocket(IndirizzoCompleto As String)As ResumableSub
    
    Ricava_IP_Porta (IndirizzoCompleto)

    Try
        'Metodo Connect del socket mSocket; viene chiamato con IP, mPorta e TimeOut
        'Prova a connettersi ad un dato indirizzo. La connessione avviene in background.
        'Quando la connessione è terminata o è fallita, viene scatenato l'evento "Connected"
        mSocket.Connect(mSoloIP,mPorta,3000)
        wait for mSocket_Connected (Successful As Boolean)
    
        Return Successful
    Catch
        Error=LastException.Message
        Return False
    End Try

End Sub
Lanciandolo si ottiene
esito test 1 true
esito test 2 false
esito test 3 false
esito test 4 false

'remmando il primo wait for
esito test 2 true
esito test 3 false
esito test 4 false
@Sabotto veramente avevo suggerito una cosa diversa. Vedi il codice che ho postato prima, dovevi solo aggiungere wait for dopo il Live.Start.
Sarebbe diventato così
B4X:
Sub Button1_Click
    Dim AddressMap As Map = CreateMap("asa":"http://185.104.124.17","nord":"https://195.60.191.158", _
    "sud":"http://185.104.124.29","bosc":"http://195.60.191.217:8080","campo em":"http://195.60.191.193:8080", _
    "castr":"http://89.21.218.179","corno":"https://195.60.191.192","foces":"http://94.101.54.205", _
    "padula":"http://94.101.60.12","pescara":"http://94.101.55.163:8080","farlocco":"http://128.123.123.245")
  
    ListView1.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.AddSingleLine(Message)
    Next
End Sub

Tu hai usato la stessa variabile/classe per tutte le connessioni , nel mio esempio la inizializzo una per ogni connessione .
 

Star-Dust

Expert
Licensed User
Longtime User
Nel codice che hai postato sarebbe cosi
B4X:
Private Sub Button1_Click
    Dim oConn As clsConnessione
    oConn.Initialize
    wait for (oConn.ConnessioneSocket("http://185.104.124.17")) complete (EsitoRisp As Boolean)
    Log("esito test 1" & "  " & EsitoRisp)

    Dim oConn As clsConnessione
    oConn.Initialize
    wait for (oConn.ConnessioneSocket("https://195.60.191.158")) complete (EsitoRisp As Boolean)
    Log("esito test 2" & "  " & EsitoRisp)

    Dim oConn As clsConnessione
    oConn.Initialize
    wait for (oConn.ConnessioneSocket("http://195.60.191.193:8080")) complete (EsitoRisp As Boolean)
    Log("esito test 3" & "  " & EsitoRisp)

    Dim oConn As clsConnessione
    oConn.Initialize
    wait for (oConn.ConnessioneSocket("http://285.104.124.17")) complete (EsitoRisp As Boolean)
    Log("esito test 4" & "  " & EsitoRisp)
 
End Sub

Poi non capisco perchè non usare un ciclo For su una lista di indirizzi ma inserirle singolarmente...... boh
 

Sabotto

Active Member
Licensed User
Poi non capisco perchè non usare un ciclo For su una lista di indirizzi ma inserirle singolarmente...... boh
Il. ciclo c'è. Questo era un esempio per il forum per inserire direttamente degli indirizzi per fare un test.
E un esempio fatto ad hoc, il programma e molto diverso.

Ok Quindi il problema è che bisogna resettare ogni volta socket o istanziare una nuova classe. Grazie appena posso provo
 

Star-Dust

Expert
Licensed User
Longtime User
Il. ciclo c'è. Questo era un esempio per il forum per inserire direttamente degli indirizzi per fare un test.
E un esempio fatto ad hoc, il programma e molto diverso.

Ok Quindi il problema è che bisogna resettare ogni volta socket o istanziare una nuova classe. Grazie appena posso provo
O chiudere il socket che hai usato prima e riaprirlo o crearne uno nuovo
 
Top