C# 多网卡UDP广播

原因:电脑同时存在多个网卡可用时,UDP广播默认只走一个网卡,造成扫描的结果无法达到目的

实现

全局变量

//接收计时器
Thread _receiveMessage;
//UDP实例
UdpClient _udpClientRec;
//定义接收数据包的地址和端口
IPEndPoint _ipEndPointSR;
//定义广播的地址端和端口号
IPEndPoint _ipEndPointS;

构造


//定义接收数据包的地址和端口
_ipEndPointSR = new IPEndPoint(IPAddress.Any, “你的端口号”);
//定义广播的地址端和端口号
_ipEndPointS = new IPEndPoint(IPAddress.Broadcast, “你的端口号”);

_receiveMessage = new Thread(ReceiveUdpPacket);
_receiveMessage.Start();
SendUdpBroadcastPacket();

SendUdpBroadcastPacket

private async void SendUdpBroadcastPacket()
{
    //判断网络是否可用
    Microsoft.VisualBasic.Devices.Network network = new Microsoft.VisualBasic.Devices.Network();
    if (!network.IsAvailable)
    {
        return;
    }
    try
    {
        //局域网广播
        List<IPAddress> iPAddresses = GetAllAdaptersIPAddress();
        foreach (var item in iPAddresses)
        {
        	using (UdpClient udpClient = new UdpClient(new IPEndPoint(item, "你的端口号")))
   		 	{
        		_ = udpClient.Send("数据流列表", "数据流列表长度", _ipEndPointS);
    		}
    	}
    }
    catch (Exception ex)
    {
    
    }
}

GetAllAdaptersIPAddress

private List<IPAddress> GetAllAdaptersIPAddress()
 {
     List<IPAddress> iPAddresses = new List<IPAddress>();
     var interfaceList = NetworkInterface.GetAllNetworkInterfaces();

     foreach (var adapter in interfaceList)
     {
         if (adapter.Description.Contains("Loopback")) continue;//跳过 环回地址127.0.0.1

         if (adapter.OperationalStatus == OperationalStatus.Up) //连接上的网口
         {
             var addresses = adapter.GetIPProperties().UnicastAddresses;

             foreach (var ip in addresses)
             {
                 if (ip.Address.AddressFamily == AddressFamily.InterNetwork)
                 {
                     iPAddresses.Add(ip.Address);
                 }
             }
         }
     }

     return iPAddresses;
 }

ReceiveUdpPacket

private void ReceiveUdpPacket()
{
    try
    {
        _udpClientRec = new UdpClient(_ipEndPointSR);
        while (true)
        {
            byte[] data = _udpClientRec.Receive(ref _ipEndPointSR);
            DispatcherInvoke(() =>
            {
                //TODO:解析包
            });
            //休息20ms
            Thread.Sleep(20);
        }
    }
    catch (Exception ex)
    {
    
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值