Listening to a UDP broadcast with threads
Question
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
Solution
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.
OTHER TIPS
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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow