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
Comments
-
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 about 15 yearsAssuming SocketNO is an Int32, System.Net.Sockets.UdpClient(SocketNO) will bind the port to IPAddress.Any