首先说明下,我的窗体上面只有一个ListBox控件,改名为lsvUsers
其次,我要实现的功能就是一运行软件,就向局域网中的用户发送一个数据包,告诉他们我上线了。然后他们都回馈一个数据包给我,我好把他们添加到我的列表中,功能已经实现,但是为什么cpu占用率居高不下呢?
一下是我的代码: public bool running = false;//标志
        public UdpClient listen = new UdpClient(2525);
        public IPEndPoint End;
        public IPAddress groupAddress = IPAddress.Parse("255.255.255.255");//广播地址
        public int groupPort = 2525;//广播端口
        public IPAddress myIP;  //本机ip地址
        public string myName;   //本机名称
        public string _data;        private void mainFrm_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            End = new IPEndPoint(groupAddress,groupPort);
            //初始化计算机名称和端口号
            IPHostEntry myentry = Dns.GetHostEntry(Dns.GetHostName());
            myIP =new IPAddress(myentry.AddressList[0].Address);   //得到本机的ip地址
            myName = Dns.GetHostName();    //得到本机名称
            
            lsvUsers.Items.Add("IP              主机名");            //开启监听线程
            running = true;
            Thread t = new Thread(new ThreadStart(ListenPort));
            t.IsBackground = false;
            t.Start();            //发送上线信息
            _data="0x01"+"|"+myIP.ToString()+"|"+myName.ToString();
            byte[] data = Encoding.Default.GetBytes(_data);
            SendPack(data);
        }        //发送广播数据包
        private void SendPack(byte[] data)
        {
            try
            {
                listen.Send(data, data.Length, End);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void ListenPort()
        {
            IPEndPoint tempEnd = new IPEndPoint(IPAddress.Any,2525);
            while (running)
            {
                Application.DoEvents();
                try
                {
                    byte[] recv = listen.Receive(ref tempEnd);
                    //检查收到的信息并进行处理
                    string recvStr = Encoding.Default.GetString(recv);
                    string[] _recvStr = recvStr.Split('|');
                    //for (int i = 0; i < _recvStr.Length; i++)
                    //{
                    //    MessageBox.Show(_recvStr[i].ToString());
                    //}
                    switch (_recvStr[0])
                    {
                        case "0x01":
                            _data = "0x01" + "|" + myIP.ToString() + "|" + myName.ToString();
                            byte[] data = Encoding.Default.GetBytes(_data);
                            SendPack(data);
                            if (lsvUsers.FindString(_recvStr[1] + "              " + _recvStr[2]) <= 0)
                            {
                                lsvUsers.Items.Add(_recvStr[1] + "              " + _recvStr[2]);
                            }
                            break;
                    }
                }
                catch(Exception ex)
                {
                    MessageBox.Show("出现错误:"+ex.Message.ToString());
                    break;
                }
            }
        }