参考

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#代码实现

发送端

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.NetworkInformation;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. namespace Test.UDP
  11. {
  12. class Program
  13. {
  14. static void Main(string[] args)
  15. {
  16. string ip = GetLocalIPv4()[0];
  17. Console.WriteLine(ip);
  18. IPAddress localAddress = IPAddress.Parse(ip);
  19. int localPort = 7788;
  20. IPAddress multicastAddress = IPAddress.Parse("234.5.6.7");
  21. int multicastPort = 5566;
  22. UdpClient client = new UdpClient(new IPEndPoint(localAddress, localPort));
  23. client.Ttl = 30;/*数据包跳数*/
  24. client.JoinMulticastGroup(multicastAddress, localAddress);
  25. client.MulticastLoopback = true;
  26. IPEndPoint multicast = new IPEndPoint(multicastAddress, multicastPort);
  27. byte[] buf = Encoding.UTF8.GetBytes("multicast");
  28. while (true)
  29. {
  30. client.Send(buf, buf.Length, multicast);
  31. Thread.Sleep(1000);
  32. }
  33. }
  34. /// <summary>
  35. /// 获取本地IPV4地址列表
  36. /// </summary>
  37. /// <returns>本地IPV4地址列表</returns>
  38. public static List<string> GetLocalIPv4()
  39. {
  40. List<string> list = new List<string>();
  41. //取得计算机内网IP,其中Dns.GetHostName()是取得计算机名称
  42. IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
  43. //遍历数组,取出IPV4的地址
  44. foreach (IPAddress ipAddress in ips)
  45. {
  46. if (ipAddress.AddressFamily.ToString().Equals("InterNetwork", StringComparison.OrdinalIgnoreCase))
  47. {
  48. list.Add(ipAddress.ToString());
  49. }
  50. }
  51. return list;
  52. }
  53. }
  54. }

接收端

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Net;
  7. using System.Net.Sockets;
  8. namespace Test.UDP
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. string ip = GetLocalIPv4()[0];
  15. Console.WriteLine(ip);
  16. IPAddress localAddress = IPAddress.Parse(ip);
  17. int localPort = 5566;
  18. IPAddress multicastAddress = IPAddress.Parse("234.5.6.7");
  19. int multicastPort = 7788;
  20. UdpClient client = new UdpClient(new IPEndPoint(localAddress, localPort));
  21. client.JoinMulticastGroup(multicastAddress, localAddress);
  22. IPEndPoint multicast = new IPEndPoint(multicastAddress, multicastPort);
  23. while (true)
  24. {
  25. byte[] buf = client.Receive(ref multicast);
  26. string msg = Encoding.UTF8.GetString(buf);
  27. Console.WriteLine(msg);
  28. }
  29. }
  30. /// <summary>
  31. /// 获取本地IPV4地址列表
  32. /// </summary>
  33. /// <returns>本地IPV4地址列表</returns>
  34. public static List<string> GetLocalIPv4()
  35. {
  36. List<string> list = new List<string>();
  37. //取得计算机内网IP,其中Dns.GetHostName()是取得计算机名称
  38. IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
  39. //遍历数组,取出IPV4的地址
  40. foreach (IPAddress ipAddress in ips)
  41. {
  42. if (ipAddress.AddressFamily.ToString().Equals("InterNetwork", StringComparison.OrdinalIgnoreCase))
  43. {
  44. list.Add(ipAddress.ToString());
  45. }
  46. }
  47. return list;
  48. }
  49. }
  50. }

如果发送和接收不是在同一台电脑上,接收方没反应,先确保双方能Ping通。
如果还是不行,尝试将两边的防火墙关闭后重新运行