关于基于UWP的UDP多通道复用

用于多设备连接

进程图

9000端口作为申请连接端口,所有设备向此端口发送设备信息,等待用户确认连接。一但用户确认则向源IP地址的8999号端口发送允许的端口号(9001号端口为例),同时建立一个对应的监听服务。客户端收到端口号后关联相应的数据服务实现

建立申请端口

            socket = new DatagramSocket();
            socket.Control.MulticastOnly = true;
            socket.MessageReceived += Socket_MessageReceived;
            await socket.BindServiceNameAsync("9000");
            #region 获取本地IP
            var hosts = NetworkInformation.GetHostNames();
            var host = hosts.FirstOrDefault(h =>
            {
                bool isIpaddr = (h.Type == Windows.Networking.HostNameType.Ipv4) || (h.Type == Windows.Networking.HostNameType.Ipv6);
                if (isIpaddr == false)
                {
                    return false;
                }
                IPInformation ipinfo = h.IPInformation;
                if (ipinfo.NetworkAdapter.IanaInterfaceType == 71 || ipinfo.NetworkAdapter.IanaInterfaceType == 6)
                {
                    return true;
                }
                return false;

绑定新通道用的服务方法

        private async void CreateLine(int Port)//绑定新通道
        {
            try
            {
                socket = new DatagramSocket();
                socket.Control.MulticastOnly = true;
                socket.MessageReceived += Socket_MessageReceived1;
                await socket.BindServiceNameAsync(Port.ToString());
            }
            catch (Exception)
            { }
        }

请求处理服务和数据处理服务

        private void Socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
        {
            string remoteaddr = args.RemoteAddress.DisplayName;//远端IP地址
            string locaddress = args.LocalAddress.DisplayName;
            string remoteport = args.RemotePort;
            bool Flag = false;//标志
            DataReader reader = args.GetDataReader();
            reader.UnicodeEncoding = UnicodeEncoding.Utf8;// 读长度
            uint len = reader.ReadUInt32();// 读内容
            string msg = reader.ReadString(reader.UnconsumedBufferLength);
            foreach (var item in ListLinkRequst)
            {
                if (item.IPAddress == remoteaddr)
                    Flag = true;//重复请求--忽略
            }
            if (Flag == false)
                ListLinkRequst.Add(new DeviceModel { IPAddress = remoteaddr, Type = msg });//添加请求列表
        }//请求通道

        private void Socket_MessageReceived1(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
        {
            string remoteaddr = args.RemoteAddress.DisplayName;//远端IP地址
            DataReader reader = args.GetDataReader();
            reader.UnicodeEncoding = UnicodeEncoding.Utf8;// 读长度
            uint len = reader.ReadUInt32();// 读内容
            string msg = reader.ReadString(reader.UnconsumedBufferLength);
            FileMethod.AddQuene(remoteaddr + "/" + msg);//压入队列
        }//数据通道

向设备发送允许连接的端口

        private async void SendAllow(int PortNum)
        {
            string content = PortNum.ToString();//响应端口请求
            if (string.IsNullOrEmpty(content)) return;
            using (DatagramSocket socket = new DatagramSocket())
            {
                HostName broardaddr = new HostName(IPAddress.Broadcast.ToString());
                IOutputStream outstream = await socket.GetOutputStreamAsync(broardaddr, "8999");
                DataWriter writer = new DataWriter(outstream);
                writer.UnicodeEncoding = UnicodeEncoding.Utf8;
                uint len = writer.MeasureString(content);
                writer.WriteUInt32(len);
                writer.WriteString(content);
                await writer.StoreAsync();
                writer.Dispose();
            }
        }//发送端口许可

向ComBox添加待连接设备

cmbIp.Items.Clear();//清除掉之前的内容
            foreach (var item in ListLinkRequst)
            {
                cmbIp.Items.Add(item.IPAddress + "/" + item.Type);
            }

效果如图,能正确的获得设备,添加设备和获取数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值