Ending a thread safely when using UDP Receive

client.Receive will return an empty byte[] when the connection is closed. You should just have to close the connection and change the provided code to:

private void RecieveChallenge()
    UdpClient client = new UdpClient(26000);
    IPEndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0);

    Byte[] receivedBytes = client.Receive(ref remoteIp);
    if (receivedBytes == null || receivedBytes.Length == 0)
    string ipAddress = Encoding.ASCII.GetString(receivedBytes);

Though you'll probably want RecieveChallenge to return a boolean indicating whether it is closed or not (of course ignoring the fact that your thread will only ever receive one message).

Instead of Receive(), you can use BeginReceive()/EndReceive() - it is an asynchronous alternative.

See MSDN: http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.beginreceive.aspx

These methods use a common APM (asynchronous programming model) of .NET.

If you want to wait for it to end before continue on your current thread, you can use


Otherwise, thread closes as soon as the last line completes.

If you want to end it early, you can use


from another thread.