private static void StartListener(string text) { bool done = false; UdpClient listener = new UdpClient(listenPort); listener.Client.ReceiveTimeout = 5000; IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); List <UDPResponse> responseList; responseList = new List <UDPResponse>(); Stopwatch s = new Stopwatch(); s.Start(); try { while (!done) { //Console.WriteLine("timespan {0}\n", TimeSpan.FromSeconds(5)); //Console.WriteLine("s.elapsed {0}\n", s.Elapsed); if (s.Elapsed < TimeSpan.FromSeconds(5)) { Console.WriteLine("Waiting for replies"); byte[] bytes = listener.Receive(ref groupEP); string remoteIPstring = groupEP.ToString(); string[] split = remoteIPstring.Split(new Char[] { ':' }); IPAddress remoteip = IPAddress.Parse(split[0]); string receivedstring = Encoding.ASCII.GetString(bytes, 0, bytes.Length); Console.WriteLine("\nReceived packet from {0}: {1}\n", remoteip, receivedstring); if (receivedstring.Length > (text.Length + 1)) //enough data received? { if (receivedstring.Substring(0, text.Length) == text) //answer packet matches search expression? { string receivedNumber = receivedstring.Substring((text.Length + 1), (receivedstring.Length - text.Length - 1)); //get ID from reply data bool validNumber = true; foreach (char c in receivedNumber) //check if receivedNumber contains only numbers { if (!char.IsNumber(c)) { validNumber = false; } } if (validNumber) { UDPResponse resp = new UDPResponse(remoteip, int.Parse(receivedNumber)); responseList.Add(resp); //add discovered ID to list Console.WriteLine("detected ID: {0}\n", receivedNumber); //show ID } else { Console.WriteLine("detected invalid character in ID: {0}\n", receivedNumber); //show error } } } } else { done = true; } } } catch (Exception e) { if (e.HResult != -2147467259) // if exception is no socket timeout which is expected { Console.WriteLine(e.ToString()); // show thrown message } } finally //clean up + show results { s.Stop(); listener.Close(); Console.WriteLine("\nfound {0} responses from the following IPs:\n", responseList.Count); //show list foreach (UDPResponse response in responseList) { Console.WriteLine("IP: {0} replied with ID: {1}", response.Address.ToString(), response.Number.ToString()); } } }
//end crazy stuff private List <UDPResponse> StartListener(String text) { List <UDPResponse> responseList = new List <UDPResponse>(); IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); SendDiscover("#DSC-arduinosearch"); UdpClient listener = new UdpClient(listenPort); listener.Client.ReceiveTimeout = BroadcastInterval; Stopwatch s = new Stopwatch(); s.Start(); while (BCrunning) //loop forever here { if (!s.IsRunning) // restart timer if necessary { s = new Stopwatch(); s.Start(); } if (s.Elapsed < TimeSpan.FromSeconds(5)) // timespan needs to be smaller than BroadcastInterval to work properly { try //try to get data from UDP listener and process it { byte[] bytes = listener.Receive(ref groupEP); string remoteIPstring = groupEP.ToString(); string[] split = remoteIPstring.Split(new Char[] { ':' }); IPAddress remoteip = IPAddress.Parse(split[0]); string receivedstring = Encoding.ASCII.GetString(bytes, 0, bytes.Length); //MessageBox.Show(remoteIPstring, receivedstring, MessageBoxButtons.OK); if (receivedstring.Length > (text.Length + 1)) //enough data received? { if (receivedstring.Substring(0, text.Length) == text) //answer packet matches search expression? { string receivedNumber = receivedstring.Substring((text.Length + 1), (receivedstring.Length - text.Length - 1)); //get ID from reply data bool validNumber = true; foreach (char c in receivedNumber) //check if receivedNumber contains only numbers { if (!char.IsNumber(c)) { validNumber = false; } } if (validNumber) { UDPResponse resp = new UDPResponse(remoteip, int.Parse(receivedNumber)); responseList.Add(resp); //add discovered ID to list string URLstring = "http://" + (resp.Address.ToString()) + "/"; //MessageBox.Show(URLstring, "calculated URL:", MessageBoxButtons.OK); if (!listBox1.Items.Contains(URLstring)) { listBox1.Items.Add(URLstring); } } else { } } } } catch (Exception exc) { if (exc.HResult != -2147467259) // if exception is no socket timeout which is expected { MessageBox.Show(exc.ToString(), "error", MessageBoxButtons.OK); } } finally { } } // end if else // if listener ran into timeout, we end up here { listener.Close(); s.Stop(); SendDiscover("#DSC-arduinosearch"); listener = new UdpClient(listenPort); listener.Client.ReceiveTimeout = BroadcastInterval; } } // break detected; BCrunning was set to false via button2 listener.Close(); s.Stop(); return(responseList); }