C#使用UdpClient发送和接收udp广播包

发布时间:2019-12-06 16:17:12.45编辑:佚名阅读(609)

简介:

由于Tcp是有连接的,所以不能用来发送广播消息。发送广播消息,必须用到Udp,Udp可以不用建立连接而发送消息。广播消息的目的IP地址是一种特殊IP地址,称为广播地址。广播地址由IP地址网络前缀加上全1主机后缀组成,如:192.168.1.255是192.169.1.0这个网络的广播地址;130.168.255.255是130.168.0.0这个网络的广播地址。向全部为1的IP地址(255.255.255.255)发送消息的话,那么理论上全世界所有的联网的计算机都能收得到了。但实际上不是这样的,一般路由器上设置抛弃这样的包,只在本地网内广播,所以效果和向本地网的广播地址发送消息是一样的。

利用udp广播可以实现像cs中建立服务器后,客户端可以收到服务器消息从而进行连接。

发送:

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Loaded -= MainWindow_Loaded;
            UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Any, 0));
            IPEndPoint endpoint = new IPEndPoint(IPAddress.Broadcast, 7788);//默认向全世界所有主机发送即可,路由器自动给你过滤,只发给局域网主机
            String ip = "host:" + Dns.GetHostEntry(Dns.GetHostName()).AddressList.Last().ToString();//对外广播本机的ip地址
            byte[] ipByte = Encoding.UTF8.GetBytes(ip);
            DispatcherTimer dt = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };//每隔1秒对外发送一次广播
            dt.Tick += delegate
            {
                client.Send(ipByte, ipByte.Length, endpoint);
            };
            dt.Start();
        }

接收:

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            Loaded -= MainWindow_Loaded;
            UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Any, 7788));//端口要与发送端相同
            Thread thread = new Thread(receiveUdpMsg);//用线程接收,避免UI卡住
            thread.IsBackground = true;
            thread.Start(client);
        }
        void receiveUdpMsg(object obj)
        {
            UdpClient client = obj as UdpClient;
            IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
            while (true)
            {
                client.BeginReceive(delegate(IAsyncResult result) {
                    Console.WriteLine(result.AsyncState.ToString());//委托接收消息
                }, Encoding.UTF8.GetString(client.Receive(ref endpoint)));
            }
        }

效果:

  关键字:C#UdpClient发送接收udp广播包


鼓掌

0

正能量

0

0

呵呵

0


评论区