コード例 #1
0
ファイル: udpdiscover.cs プロジェクト: DennisSc/UDPdiscover
    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());
            }
        }
    }
コード例 #2
0
        //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);
        }