参考
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通。
如果还是不行,尝试将两边的防火墙关闭后重新运行