参考
https://support.huawei.com/enterprise/zh/doc/EDOC1100105907 (什么是组播) https://blog.csdn.net/qq_43207781/article/details/105722804 (组播地址) https://baike.baidu.com/item/%E7%BB%84%E6%92%AD%E5%9C%B0%E5%9D%80 (组播地址) https://www.cnblogs.com/luchi88/p/10948781.html (UDP组播发送与接收) https://blog.csdn.net/adream307/article/details/8231187 (C#实现UDP组播)
组播概念
数据只需要发送一次,可以被多个主机接收
组播用途
网络直播源(IPTV),视频会议,视频点播,远程教学等
组播地址
分类 组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用; 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet; 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效; 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。
组播地址列表 列表如下: 224.0.0.0 基准地址(保留) 224.0.0.1 所有主机的地址 (包括所有路由器地址) 224.0.0.2 所有组播路由器的地址 224.0.0.3 不分配 224.0.0.4 dvmrp路由器 224.0.0.5 所有ospf路由器 224.0.0.6 ospf DR/BDR 224.0.0.7 st路由器 224.0.0.8 st主机 224.0.0.9 rip-2路由器 224.0.0.10 Eigrp路由器 224.0.0.11 活动代理 224.0.0.12 dhcp 服务器/中继代理 224.0.0.13 所有pim路由器 224.0.0.14 rsvp封装 224.0.0.15 所有cbt路由器 224.0.0.16 指定sbm 224.0.0.17 所有sbms 224.0.0.18 vrrp 224.0.0.22 IGMPv3
C#代码实现
发送端
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.NetworkInformation;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;namespace Test.UDP{class Program{static void Main(string[] args){string ip = GetLocalIPv4()[0];Console.WriteLine(ip);IPAddress localAddress = IPAddress.Parse(ip);int localPort = 7788;IPAddress multicastAddress = IPAddress.Parse("234.5.6.7");int multicastPort = 5566;UdpClient client = new UdpClient(new IPEndPoint(localAddress, localPort));client.Ttl = 30;/*数据包跳数*/client.JoinMulticastGroup(multicastAddress, localAddress);client.MulticastLoopback = true;IPEndPoint multicast = new IPEndPoint(multicastAddress, multicastPort);byte[] buf = Encoding.UTF8.GetBytes("multicast");while (true){client.Send(buf, buf.Length, multicast);Thread.Sleep(1000);}}/// <summary>/// 获取本地IPV4地址列表/// </summary>/// <returns>本地IPV4地址列表</returns>public static List<string> GetLocalIPv4(){List<string> list = new List<string>();//取得计算机内网IP,其中Dns.GetHostName()是取得计算机名称IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());//遍历数组,取出IPV4的地址foreach (IPAddress ipAddress in ips){if (ipAddress.AddressFamily.ToString().Equals("InterNetwork", StringComparison.OrdinalIgnoreCase)){list.Add(ipAddress.ToString());}}return list;}}}
接收端
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;namespace Test.UDP{class Program{static void Main(string[] args){string ip = GetLocalIPv4()[0];Console.WriteLine(ip);IPAddress localAddress = IPAddress.Parse(ip);int localPort = 5566;IPAddress multicastAddress = IPAddress.Parse("234.5.6.7");int multicastPort = 7788;UdpClient client = new UdpClient(new IPEndPoint(localAddress, localPort));client.JoinMulticastGroup(multicastAddress, localAddress);IPEndPoint multicast = new IPEndPoint(multicastAddress, multicastPort);while (true){byte[] buf = client.Receive(ref multicast);string msg = Encoding.UTF8.GetString(buf);Console.WriteLine(msg);}}/// <summary>/// 获取本地IPV4地址列表/// </summary>/// <returns>本地IPV4地址列表</returns>public static List<string> GetLocalIPv4(){List<string> list = new List<string>();//取得计算机内网IP,其中Dns.GetHostName()是取得计算机名称IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());//遍历数组,取出IPV4的地址foreach (IPAddress ipAddress in ips){if (ipAddress.AddressFamily.ToString().Equals("InterNetwork", StringComparison.OrdinalIgnoreCase)){list.Add(ipAddress.ToString());}}return list;}}}
注
如果发送和接收不是在同一台电脑上,接收方没反应,先确保双方能Ping通。
如果还是不行,尝试将两边的防火墙关闭后重新运行
