Italian [SOLVED] Ricerca IP Server con UDP

Star-Dust

Expert
Licensed User
Longtime User
Premesso che é la prima volta che provo il socket UDP. Raccogliendo un ispirazione da un POST di Erel che parla di un server MQTT che invia l'indirizzo IP con un ping nella rete con protocollo UDP.

Ho cercato di implementare un service che ogni 30 secondi invia un PING alla rete con l'indirizzo del server, in modo che i client si possano agganciare. Cosa ho sbagliato?

N.B. GetBroadcastAddress l'ha postato Erel in un suo Post io ho solo ricopiato, quindi sarà corretto, e serve a trovare l'indirizzo BroadCasting della rete.

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim PingServer As UDPSocket
    Dim IP As ServerSocket
  
End Sub

Sub Service_Create
    PingServer.Initialize("PingServer",1010,200)
    IP.Initialize(1010, "IP")
End Sub

Sub Service_Start (StartingIntent As Intent)

    Dim Packet As UDPPacket
    Packet.Initialize(IP.GetMyWifiIP.GetBytes("UTF8"), GetBroadcastAddress, 1010)
    PingServer.Send(Packet)
End Sub

Sub Service_Destroy
    StartServiceAt(Me,DateTime.Now+DateTime.TicksPerSecond*30,False)
End Sub

Sub UDP_PacketArrived (Packet As UDPPacket)
    Log(BytesToString(Packet.Data,0,Packet.Data.Length,"UTF-8"))
End Sub

Sub GetBroadcastAddress As String
    Dim niIterator As JavaObject
    niIterator = niIterator.InitializeStatic("java.net.NetworkInterface").RunMethod("getNetworkInterfaces", Null)
    Do While niIterator.RunMethod("hasMoreElements", Null)
        Dim ni As JavaObject = niIterator.RunMethod("nextElement", Null)
        If ni.RunMethod("isLoopback", Null) = False Then
            Dim addresses As List = ni.RunMethod("getInterfaceAddresses", Null)
            For Each ia As JavaObject In addresses
                Dim broadcast As Object = ia.RunMethod("getBroadcast", Null)
                If broadcast <> Null Then
                    Dim b As String = broadcast
                    Return b.SubString(1)
                End If
            Next
        End If
    Loop
    Return ""
End Sub
 

Star-Dust

Expert
Licensed User
Longtime User
RISOLTO COSI

Ricopiando il codice di EREL

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim PingServer As UDPSocket
    Private BroadcastTimer As Timer
    Private serializator As B4XSerializator
    Private ServerS As ServerSocket
End Sub

Sub Service_Create
    PingServer.Initialize("PingServer",51049,8192)
    BroadcastTimer.Initialize("BroadcastTimer", DateTime.TicksPerSecond*15)
    BroadcastTimer.Enabled=True
End Sub

Sub Service_Start (StartingIntent As Intent)
 
End Sub

Sub Service_Destroy
End Sub

Private Sub BroadcastTimer_Tick
    Dim address As String = GetBroadcastAddress
    If address <> "" Then
        Dim up As UDPPacket
        up.Initialize(serializator.ConvertObjectToBytes(ServerS.GetMyWifiIP), address, 51049)
        PingServer.Send(up)
    End If
End Sub

Sub GetBroadcastAddress As String
    Dim niIterator As JavaObject
    niIterator = niIterator.InitializeStatic("java.net.NetworkInterface").RunMethod("getNetworkInterfaces", Null)
    Do While niIterator.RunMethod("hasMoreElements", Null)
        Dim ni As JavaObject = niIterator.RunMethod("nextElement", Null)
        If ni.RunMethod("isLoopback", Null) = False Then
            Dim addresses As List = ni.RunMethod("getInterfaceAddresses", Null)
            For Each ia As JavaObject In addresses
                Dim broadcast As Object = ia.RunMethod("getBroadcast", Null)
                If broadcast <> Null Then
                    Dim b As String = broadcast
                    Return b.SubString(1)
                End If
            Next
        End If
    Loop
    Return ""
End Sub
 
Last edited:

calsdn

Member
Licensed User
è un po' OT ma come modifichi il titolo della discussione per dire che hai risolto?
 

LucaMs

Expert
Licensed User
Longtime User
è un po' OT ma come modifichi il titolo della discussione per dire che hai risolto?
upload_2017-4-3_13-13-41.png
 

Star-Dust

Expert
Licensed User
Longtime User
Non so cosa vuol dire OT sono troppo vecchio.

Vai su Thread Tools in alto appena sotto il titolo, clicca e trovi Edit Thread e puoi modificare
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
Scusate io ancora sono fra quelli che immotivatamente si ostinano a usare l'italiano in prosa senza nemmeno un acronimo. Ogni tanto qualche sineddoche.. Ma senza impegno
 
Last edited:
Top