C#套接字(Socket)通信之UDP组播详解

作者:微小冷 时间:2022-06-11 05:49:52 

组播的概念

UDP信息传递的方式分三类,分别是

  • 单播 Unicast:客户端与服务器之间的点到点连接

  • 多播MultiCast:又称组播,是“一对一组”的通讯模式,加入同一个组的主机可以接受到此组内的所有数据。

  • 广播 BroadCast:主机之间“一对所有”的通讯模式,广播者可以向网络中所有主机发送信息。广播禁止在Internet宽带网上传输。

其中单播比较简单,在C#中可直接通过UdpClient点对点收发。

组播和单播的差别是,必须得有一个“组”的概念,然后才能进行组播,在C#中,通过client.JoinMulticastGroup来实现。

另外,组播对IP地址的范围有一定的要求:

起始IP截至IP适用范围
224.0.0.1224.0.0.255预留地址,最好不要乱用
224.0.1.0224.0.1.255公用地址,可用于互联网
224.0.2.0238.255.255.255用户可用,全网范围
239.0.0.0239.255.255.255本地

其中224.0.0.0也是预留的组播地址,但保留不做分配。

简单示例

下面再顶级语句中做一个简单的示例

using System.Net;
using System.Net.Sockets;
using System.Text;

static void Main()
{
   UdpClient client = new UdpClient(5566);
   client.JoinMulticastGroup(IPAddress.Parse("235.5.6.8"));

IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("234.5.6.7"), 7788);
   byte[] buf = Encoding.Default.GetBytes("Hello from multicast");
   Thread t = new Thread(new ThreadStart(RecvThread));
   t.IsBackground = true;
   t.Start();
   while (true)
   {
       client.Send(buf, buf.Length, multicast);
       Thread.Sleep(1000);
   }
}

static void RecvThread()
{
   UdpClient client = new UdpClient(7788);
   client.JoinMulticastGroup(IPAddress.Parse("234.5.6.7"));
   IPEndPoint multicast = new IPEndPoint(IPAddress.Parse("235.5.6.8"), 5566);
   while (true)
   {
       byte[] buf = client.Receive(ref multicast);
       string msg = Encoding.Default.GetString(buf);
       Console.WriteLine(msg);
   }
}

Main();

函数RecvThread中,定义了一个端口号为7778的UDP客户端,并通过JoinMulticastGroup添加了234.5.6.7这个IP地址。在死循环中,让client不断接收来自multicast的信息,其中multicast是地址为235.5.6.8,端口为5566的终端。

Main函数则创建了端口为5566的客户端,然后不断地向234.5.6.7:7788发送消息。

这个示例程序运行之后,命令行中会不断地输出

Hello from multicast

但这个示例其实并没有体现出“组播”的特点,原因在于上面的代码只用了一个地址,虽然用到了组播的模式,但实际操作上来看,还是一对一的。

组播的优势

下面稍微修改一下代码,首先在RecvThread中新增一个IP

client.JoinMulticastGroup(IPAddress.Parse("234.5.6.9"));

然后在Main中新增一组发给新IP的信息,类似下面这样

static void Main()
{
   UdpClient client = new UdpClient(5566);
   client.JoinMulticastGroup(IPAddress.Parse("235.5.6.8"));
   IPEndPoint multi1 = new IPEndPoint(IPAddress.Parse("234.5.6.7"), 7788);
   IPEndPoint multi2 = new IPEndPoint(IPAddress.Parse("234.5.6.9"), 7788);
   byte[] buf1 = Encoding.Default.GetBytes("Hello multi1");
   byte[] buf2 = Encoding.Default.GetBytes("Hello multi2");
   Thread t = new Thread(new ThreadStart(RecvThread));
   t.IsBackground = true;
   t.Start();
   while (true)
   {
       client.Send(buf1, buf1.Length, multi1);
       client.Send(buf2, buf2.Length, multi2);
       Thread.Sleep(1000);
   }
}

从而命令行输出就会变成

Hello multi1
Hello multi2

也就是说,发给两个不同IP地址的信息,都被client接收到了。

来源:https://blog.csdn.net/m0_37816922/article/details/130161039

标签:C#,UDP,组播,套接字
0
投稿

猜你喜欢

  • java JSONArray 遍历方式(2种)

    2021-09-07 19:52:48
  • Java之InputStreamReader类的实现

    2023-09-03 01:28:17
  • java常用工具类之DES和Base64加密解密类

    2023-12-20 17:48:31
  • java中抽象类和接口的相同和不同点介绍

    2021-05-30 04:53:31
  • java如何使用自己的maven本地仓库详解

    2022-08-01 12:13:44
  • Java优化if-else代码的实战记录

    2023-05-16 22:55:18
  • Java 实战练手项目之医院预约挂号系统的实现流程

    2023-11-24 00:42:36
  • Java 集合框架之List 的使用(附小游戏练习)

    2023-11-24 10:33:40
  • Java编程GUI中的事件绑定代码示例

    2023-02-04 17:36:01
  • 一文带你全面了解Java Hashtable

    2021-09-19 01:39:39
  • java实现文件上传下载功能

    2021-11-26 17:19:05
  • 详解Java目录操作与文件操作教程

    2023-12-05 13:45:48
  • C#构建树形结构数据(全部构建,查找构建)

    2022-07-22 12:22:52
  • Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)

    2023-11-26 11:59:41
  • 带着问题读CLR via C#(笔记二)类型基础

    2022-01-31 07:31:08
  • JDK源码之Vector与HashSet解析

    2021-09-06 10:47:23
  • 使用controller传boolean形式值

    2023-11-28 23:05:33
  • java类中生成jfreechart,返回图表的url地址 代码分享

    2023-09-08 00:54:07
  • 解析rainbond以应用为中心的架构设计原理

    2023-02-05 14:19:50
  • Maven+Tomcat8 实现自动化部署的方法

    2023-01-03 06:44:20
  • asp之家 软件编程 m.aspxhome.com