用于多设备连接
进程图
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);
}
效果如图,能正确的获得设备,添加设备和获取数据