C#学习教程:向所有可用的网卡广播UDP消息由于有3个网卡,10.1.xx10.2.xx10.4.xx当我发送UDP消息时,我只在一个网络适配器中收到消息...其余的ips没有收到。我想在发送消息时检查网络适配器。我怎样才能做到这一点?目前我使用以下内容:IPEndPointlocalEndPoint=newIPEndPoint(IPAddress.Parse(LocalIP),0);IPEndPointtargetEndPoint=newIPEndPoint(TargetIP,iTargetPort);UdpClientsendUdpClient=newUdpClient(localEndPoint);,CombineHeaderBody.Length,targetEndPoint);这实际上比听起来更棘手,因为如果您有多个接口,广播不会总是出现在所有接口上。为了解决这个问题,我创建了这个类。publicclassMyUdpClient:UdpClient{publicMyUdpClient():base(){//调用属于UdpClient基类的protectedClient属性。Sockets=this.Client;//使用Client返回的Socket设置一个使用UdpClient不可用的选项。s.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);s.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.DontRoute,1);}publicMyUdpClient(IPEndPointipLocalEndPoint){Lo:调用属于UdpClient基类的受保护的Client属性。Sockets=this.Client;//使用Client返回的Socket设置一个不可用的optionusingUdpClient.s.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);s.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.DontRoute,1);然后通过广播发送UDP数据包,我使用类似下面的东西。我将IPAddress.Broadcast与MyUdpClient一起使用,这与您的代码不同。IPEndPointlocalEndPoint=newIPEndPoint(IPAddress.Parse(LocalIP),0);IPEndPointtargetEndPoint=newIPEndPoint(IPAddress.Broadcast,iTargetPort);MyUdpClientsendUdpClient=newMyUdpClient(localEndPoint);intnumBytesSent=sendUdpClient.Send(CombineHeaderBody,CombineHeaderBody.Length,targetEndPoint);另外,您应该注意,当您使用特定的ip地址而不是广播时,路由表只会将它发送到与该地址匹配的接口。因此,在您的示例中,使用了单播。您需要将LocalIP设置为您要发送到的本地接口的IP。使用三个接口,您将拥有三个本地IP,您需要选择正确的一个来使用。IPEndPointlocalEndPoint=newIPEndPoint(IPAddress.Parse(LocalIP),0);IPEndPointtargetEndPoint=newIPEndPoint(TargetIP,iTargetPort);MyUdpClientsendUdpClient=newMyUdpClient(localEndPoint);intnumBytesSent=sendUdpClient.Send(CombineHeaderBody,CombineHeaderBody.Length,targetEndPoint);由于路由已关闭,您可能会在所有接口上看到它,但您需要针对单播情况对其进行测试。如果您不关心发送IP或端口,您可以使用以下代码。IPEndPointtargetEndPoint=newIPEndPoint(TargetIP,iTargetPort);MyUdpClientsendUdpClient=newMyUdpClient();intnumBytesSent=sendUdpClient.Send(CombineHeaderBody,CombineHeaderBody.Length,targetEndPoint);或者用于广播IPEndPointtargetEndPoint=newIPEndPoint(IPAddress.Broadcast,iTargetPort);MyUdpClientsendUdpClient=newMyUdpClient();intnumBytesSent=sendUdpClient.Send(CombineHeaderBody,CombineHeaderBody.Length,targetEndPoint);IPAddress.Broadcast的问题在于它们没有通过任何网关进行路由。要解决此问题,您可以创建一个IP地址列表,然后循环发送。此外,您还应该有一个try/catch块,因为发送可能会由于您无法控制的网络问题而失败。ArrayListip_addr_acq=newArrayList();ip_addr_acq.Add(IPAddress.Parse("10.1.1.1"));//添加到要发送的地址列表以尝试{foreach(IPAddresscurAddinip_addr_acq){IPEndPointtargetEndPoint=newIPEndPoint(curAdd,iTargetPort);MyUdpClientsendUdpClient=newMyUdpClient();intnumBytesSent=sendUdpClient.Send(CombineHeaderBody,CombineHeaderBody.Length,targetEndPoint);线程.睡眠(40);//每条消息之间的小延迟{//}}c任何异常}编辑:请参阅上面的更改为具有多个接口的单播,以及尝试将单播数据包发送到可用网络的问题。扩展雷克斯的答案。这使您不必硬编码要广播的IP地址。遍历所有接口,检查它们是否已启动,确保它具有IPv4信息以及与之关联的IPv4地址。只需将“数据”变量更改为您要广播的数据,将“目标”端口更改为您想要的数据即可。一个小的缺点是,如果一个接口有多个与之关联的IP地址,它将从每个地址进行广播。注意:这也将尝试通过任何VPN适配器发送广播(通过网络和共享中心/网络连接,Win7+验证),如果您想收到响应,您必须保存所有客户端。您也不需要二级课程。foreach(NetworkInterfaceniinNetworkInterface.GetAllNetworkInterfaces()){if(ni.OperationalStatus==OperationalStatus.Up&&ni.SupportsMulticast&&ni.GetIPProperties().GetIPv4Properties()!=null){intid=ni.GetIPProperties().GetIPv4Properties().Index;if(NetworkInterface.LoopbackInterfaceIndex!=id){foreach(UnicastIPAddressInformationuipinni.GetIPProperties().UnicastAddresses){if(uip.Address.AddressFamily==AddressFamily.InterNetwork){IPEndPointlocal=newIPEndPoint(uip.Address.Address,0);UdpClientudpc=newUdpClient(local);udpc.Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);udpc.Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.DontRoute,1);byte[]data=newbyte[10]{1,2,3,4,5,6,7,8,9,10};IPEndPointtarget=newIPEndPoint(IPAddress.Broadcast,48888);udpc.发送(数据,数据。长度,目标);}}}}}如果您要发送到特定的IP地址,那么您是单播,而不是广播。我通过从每个适配器发送UDP广播(使用bind)解决了这个问题:以上就是C#学习教程的全部内容:广播UDP消息给所有可用的网卡共享,如果对大家有用还需要了解更多关于C#学习教程,希望大家多多关注—publicstaticvoidSNCT_SendBroadcast(outListDevicesList){DevicesList=newList();字节[]数据=新字节[2];//广播数据data[0]=0x0A;数据[1]=0x60;IPEndPointip=newIPEndPoint(IPAddress.Broadcast,45000);//广播IP地址,以及对应的端口NetworkInterface[]nics=System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();//获取计算机的所有网络接口foreach(networkInterfaceadapterinnics){//仅选择以太网类型且支持IPv4的接口(重要的是尽量减少等待时间)if(adapter.NetworkInterfaceType!=NetworkInterfaceType.Ethernet){continue;}if(adapter.Supports(NetworkInterfaceComponent.IPv4)==false){继续;}尝试{IPInterfacePropertiesadapterProperties=adapter.GetIPProperties();foreach(adapterProperties.UnicastAddress中的ua变量es){if(ua.Address.AddressFamily==System.Net.Sockets.AddressFamily.InterNetwork){//在适配器中发送广播//1)将套接字设置为UDP客户端套接字bcSocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);//广播套接字//2)设置socker选项bcSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);bcSocket.ReceiveTimeout=200;//接收超时200ms//3)绑定到当前选择的适配器IPEndPointmyLocalEndPoint=newIPEndPoint(ua.Address,45000);bcSocket.Bind(myLocalEndPoint);//4)发送广播数据bcSocket.SendTo(data,ip);//在适配器中接收广播intBUFFER_SIZE_ANSWER=1024;byte[]bufferAnswer=newbyte[BUFFER_SIZE_ANSWER];做{尝试{bcSocket.Receive(bufferAnswer);DevicesList.Add(GetMyDevice(bufferAnswer));//对应函数获取设备信息。取决于应用程序。}抓住{休息;}}while(bcSocket.ReceiveTime输出!=0);//固定接收超时每个适配器支持我们的广播bcSocket.Close();}}}赶上{}}返回;如管理员删除,如有转载,请注明出处:
