Listening to a UDP broadcast with threads

14,364

Solution 1

This article seems to be doing almost exactly what you're trying to do and explains it pretty well with lots of comments in the code.

Solution 2

To listen to an UDP port you must bind the port. Here is some c# code that I use. It using a receive thread that polls the socket for the messages.

Socket soUdp_msg = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
IPEndPoint localIpEndPoint_msg = new IPEndPoint(IPAddress.Any, UdpPort_msg);
soUdp_msg.Bind(localIpEndPoint_msg);

Then in my receive thread

 byte[] received_s = new byte[2048];
 IPEndPoint tmpIpEndPoint = new IPEndPoint(IPAddress.Any, UdpPort_msg);
 EndPoint remoteEP = (tmpIpEndPoint);

 while (soUdp_msg.Poll(0, SelectMode.SelectRead))
 {

    int sz = soUdp_msg.ReceiveFrom(received_s, ref remoteEP);
    tep = (IPEndPoint)remoteEP;

    // do some work
 }

 Thread.Sleep(50); // sleep so receive thread does not dominate computer
Share:
14,364
Diaco
Author by

Diaco

Passionate software developer.

Updated on June 04, 2022

Comments

  • Diaco
    Diaco almost 2 years

    I'm broadcasting a simple message to ..*.255 (changing to 255 the last part of my ip) and i'm trying to listen to it. the code returns no error but i'm not receiving anything. In wireshark I can see the broacast is sent correctly, but with a different port each time (I don't know if that's a big deal). Here's some parts of my code.

    Private Sub connect()
        setip()
        btnsend.Enabled = True
        btndisconnect.Enabled = True
        btnconnect.Enabled = False
        receive()
        txtmsg.Enabled = True
    End Sub
    
    Sub receive()
        Try
            SocketNO = port
            rClient = New System.Net.Sockets.UdpClient(SocketNO)
            rClient.EnableBroadcast = True
            ThreadReceive = _
               New System.Threading.Thread(AddressOf receivemessages)
            If ThreadReceive.IsAlive = False Then
                ThreadReceive.Start()
            Else
                ThreadReceive.Resume()
            End If
        Catch ex As Exception
            MsgBox("Error")
        End Try
    End Sub
    
    Sub receivemessages()
        Dim receiveBytes As Byte() = rClient.Receive(rip)
        Dim BitDet As BitArray
        BitDet = New BitArray(receiveBytes)
        Dim strReturnData As String = _
                    System.Text.Encoding.Unicode.GetString(receiveBytes)
        MsgBox(strReturnData.ToString)
    End Sub
    
     Private Sub setip()
        hostname = System.Net.Dns.GetHostName
        myip = IPAddress.Parse(System.Net.Dns.GetHostEntry(hostname).AddressList(1).ToString)
        ipsplit = myip.ToString.Split(".".ToCharArray())
        ipsplit(3) = 255
        broadcastip = IPAddress.Parse(ipsplit(0) & "." & ipsplit(1) & "." + ipsplit(2) + "." + ipsplit(3))
        iep = New IPEndPoint(broadcastip, port)
    
    End Sub
    
    Sub sendmsg()
        Dim msg As Byte()
        MsgBox(myip.ToString)
        sclient = New UdpClient
        sclient.EnableBroadcast = True
        msg = Encoding.ASCII.GetBytes(txtmsg.Text)
        sclient.Send(msg, msg.Length, iep)
        sclient.Close()
        txtmsg.Clear()
    End Sub
    
  • Dave
    Dave about 15 years
    Assuming SocketNO is an Int32, System.Net.Sockets.UdpClient(SocketNO) will bind the port to IPAddress.Any