UDP client   zodpovězená otázka

VB.NET

Dobrý den, prosím o radu. Na určitý UDP port mi chodí náhodně nějaký string a já bych si jej rád vypisoval. Problém je v tom, že mi to vypíše vždy jen jeden string co příjde a pak už žádný další. Jakoby aplikace přestala naslouchat. Jak to mám udělat, aby vždy po příchodu dat na port byla vyvolána nějaká akce? Kdysi jsem to řešil ve VB 6.0 pomoci winsock a tam bylo data arrival, jenže teď bych to rád řešil s využitím .NET.

Předem děkuji.

Imports System.Net.Sockets
Public Class Form1
    Dim Udp As UdpClient
    Dim REP As New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0)
    Dim ThreadReceive As System.Threading.Thread

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Udp = New System.Net.Sockets.UdpClient(1111)
        ThreadReceive = New System.Threading.Thread(AddressOf ReceiveMessages)
        ThreadReceive.Start()
    End Sub

    Public Sub ReceiveMessages()
        Dim receiveBytes As [Byte]() = Udp.Receive(REP)
        Dim BitDet As BitArray
        BitDet = New BitArray(receiveBytes)
        Dim strReturnData As String = System.Text.Encoding.ASCII.GetString(receiveBytes)
        If Me.InvokeRequired() Then
            Dim dr As New DataRecievedDelegate(AddressOf UdpRecieved)
            Me.Invoke(dr, strReturnData)
        Else
            UdpRecieved(strReturnData)
        End If
    End Sub

    Delegate Sub DataRecievedDelegate(ByVal strReturnData As System.String)
    Sub UdpRecieved(ByVal strReturnData As System.String)
        ListBox1.Items.Add(strReturnData)
    End Sub
End Class
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dobrý den,

je to protože procedura ReceiveMessages se provede jen jednou. A to z důvodu, že ji poprvé a naposledy zavoláte v Button1_Click.Řešení:

   Public Sub ReceiveMessages()
	Try
            Do While True

                Dim receiveBytes As [Byte]() = Udp.Receive(REP)
                Dim BitDet As BitArray
                BitDet = New BitArray(receiveBytes)
                Dim strReturnData As String = System.Text.Encoding.ASCII.GetString(receiveBytes)
                If Me.InvokeRequired() Then
                    Dim dr As New DataRecievedDelegate(AddressOf UdpRecieved)
                    Me.Invoke(dr, strReturnData)
                Else
                    UdpRecieved(strReturnData)
                End If
            Loop
	Catch
		' spojení zřejmě ukončeno
	End Try
    End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

A kdybych to cele chtel udelat jako sluzbu systemu (samozdrejme bez formulare, jen by se to treba nekam logovalo) tak jak na to? Se servisem nemam problem, jen jak udelat, at se to nastartuje po startu servisu a stopne po zastaveni, co dat do kodu on start a on stop...

A kam pak dát toto:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Udp = New System.Net.Sockets.UdpClient(1111)
        ThreadReceive = New System.Threading.Thread(AddressOf ReceiveMessages)
        ThreadReceive.Start()
    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

tak uz to mam... jsem to co je v button1_click dal do on start a do on stop jsem dal udp.close a vypada to, ze to dela to co chci

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mám ještě jeden dotaz k UDP, tentokrát k odesílání. Z jednoho počítače potřebuji něco odeslat na více počítačů v síti, přičemž znám vždy IP adresu a port cílového počítače. Nyní to dělám tak, že se mi spustí cyklus a vněm vždy provedu odeslání s tím, že se mi změní IP a port (což si načítám z pole).

For i = 1 To ClientCount
                    udpSend.Connect(GPSclientArray(i - 1).IP_adr, GPSclientArray(i - 1).port)
                    SendData = System.Text.Encoding.ASCII.GetBytes(strSendData)
                    udpSend.Send(SendData, SendData.Length)
                Next i

Nicméně pokud budu mít opravdu hodně počítačů, na které chci něco zaslat, tak se mi to zdá jako ne příliš šťastné řešení. Zajímalo by mne, jestli jde udělat to, že by se to odeslalo pouze jednou na nějaký "list" počítačů, prostě ať tam nemusí být ten cyklus. Děkuji za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

nikdo???

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback