C# 实现udp广播收集局域网设备代码

17 篇文章 13 订阅

写过一篇没放代码,现在放上来

在这里插入图片描述
udpBroadCast

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace UdpBroadCast
{
    class Program
    {
       
     
         private static Socket sock;
        private static Socket sock2;
        private static IPEndPoint iep1;
         private static byte[] data;
        
         static void Main(string[] args)
         {
            //创建UDPsocket通讯实例
             sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
            //创建一个广播实例,指定端口号9050
             iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);
            //获取主机名
             string hostname = GetLocalIP();
             //准备发送字节数组
             data = Encoding.ASCII.GetBytes("if you see this message ,you need to send your info to this ip: "+hostname+"and this port:9060");
            //设置套接字选项
             sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast, 1);

            
            //开启线程每两秒广播一次主机IP
            Thread t = new Thread(BroadcastMessage);
             t.Start();
            //sock.Close();
            //开启线程每两秒接收一次消息
            //Thread t2 = new Thread(RecMsg);
            //t2.Start();
            Console.ReadKey();

         }
 
        private static void BroadcastMessage()
         {
             while (true)
             {
                 Console.WriteLine("广播内容:"+  System.Text.Encoding.Default.GetString(data) );
                 sock.SendTo(data, iep1);
                
                 Thread.Sleep(2000);
             }

         }

        private static void RecMsg() {
            sock2 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            //创建一个端口为9050的终结点
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
            //绑定
            sock2.Bind(iep);
            
            EndPoint ep = (EndPoint)iep;
            while (true) {
               
                Console.WriteLine("Ready to receive…");
                byte[] data = new byte[1024];
                int recv = sock2.ReceiveFrom(data, ref ep);
                string stringData = Encoding.ASCII.GetString(data, 0, recv);

                Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString());
                


            }
            //sock2.Close();

        }
        //获取本机IPV4
        public static string GetLocalIP()
        {
            try
            {
                string HostName = Dns.GetHostName(); //得到主机名
                IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
                for (int i = 0; i < IpEntry.AddressList.Length; i++)
                {
                    //从IP地址列表中筛选出IPv4类型的IP地址
                    //AddressFamily.InterNetwork表示此IP为IPv4,
                    //AddressFamily.InterNetworkV6表示此地址为IPv6类型
                    if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                    {
                        return IpEntry.AddressList[i].ToString();
                    }
                }
                return "";
            }
            catch (Exception ex)
            {
                Console.WriteLine("获取本机IP出错:" + ex.Message);
                return "";
            }
        }






    }
}

udpClient

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace UdpClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建一个UDPSocket
            Socket sock = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
            //创建一个端口为9060的终结点
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9060);
           
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Boolean flag = true;
            byte[] data = new byte[1024];
            while (flag) {
                
                Console.WriteLine("Ready to receive…");

                
                int recv = sock.ReceiveFrom(data, ref ep);
                string stringData = Encoding.ASCII.GetString(data, 0, recv);
                if (CheckRecStr(stringData)) {
                    Console.WriteLine("接收字符串格式正确");
                    //存起来
                }

                Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString());
                //sock.Close();

            }
            sock.Close();
        }
        /// <summary>
        /// 校验字符串是否符合规范
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static Boolean CheckRecStr(string msg) {
            //包裹在#---&&中,诸如此类##collector&&
            return !String.IsNullOrEmpty(msg) && msg.StartsWith("##") && msg.EndsWith("&&");
        }

        
    }
}

好了

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的C#示例代码实现UDP通讯帧数据的打包: ```csharp //定义UDP通讯帧结构体 struct UdpFrame { public byte FrameHead; public ushort DataLength; public byte[] Data; public byte FrameTail; //打包方法 public byte[] Pack() { byte[] result = new byte[4 + DataLength]; result[0] = FrameHead; result[1] = (byte)(DataLength & 0xFF); result[2] = (byte)((DataLength >> 8) & 0xFF); Array.Copy(Data, 0, result, 3, DataLength); result[3 + DataLength] = FrameTail; return result; } //解包方法 public static UdpFrame Unpack(byte[] data) { UdpFrame frame; frame.FrameHead = data[0]; frame.DataLength = (ushort)((data[2] << 8) | data[1]); frame.Data = new byte[frame.DataLength]; Array.Copy(data, 3, frame.Data, 0, frame.DataLength); frame.FrameTail = data[3 + frame.DataLength]; return frame; } } //示例代码 UdpFrame frame; frame.FrameHead = 0xAA; frame.DataLength = 5; frame.Data = new byte[5] { 0x01, 0x02, 0x03, 0x04, 0x05 }; frame.FrameTail = 0x55; byte[] packedData = frame.Pack(); //将packedData发送给UDP服务器 //接收到的数据 byte[] receivedData = new byte[1024]; //从UDP服务器接收到的数据存放在receivedData中 UdpFrame receivedFrame = UdpFrame.Unpack(receivedData); ``` 在示例代码中,定义了一个UdpFrame结构体,包括帧头、数据长度、数据、帧尾四个字段。其中,打包方法Pack将结构体打包成一个字节数组,解包方法Unpack从接收到的字节数组中解析出UdpFrame结构体。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值