多播程序设计(基于UDP协议)

首先要搞清楚多播IP地址有哪些

D类IP地址就是多播地址,范围是224.0.0.0 ~ 239.255.255.255

其中又划分为以下类别

D类地址的划分

类别 地址范围 描述
局部链接地址(本地网络控制块) 224.0.0.0~224.0.0.255 用于局域网,路由器不转发属于此范围的IP包
预留多播地址 224.0.1.0~238.255.255.255 用于全球范围或网络协议
管理权限地址 239.0.0.0~239.255.255.255 组织内部使用,用于限制多播范围

服务器端:

 1     private UdpClient udpSend;
 2 
 3         private void button1_Click(object sender, EventArgs e)
 4         {
 5             //判断是否为空
 6             if(this.richTextBox1.Text == "")
 7             {
 8                 MessageBox.Show("Please input the text");
 9                 return;
10             }
11 
12             //初始始UdpClient
13             udpSend = new UdpClient();
14             //允许发送和接收广播数据报
15             udpSend.EnableBroadcast = true;
16 
17 
18             //必须使用组播地址范围内的地址
19             IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.0.0.10"), 8000);
20 
21             byte[] bytes = Encoding.UTF8.GetBytes(this.richTextBox1.Text);
22 
23             //发送组播信息
24             try
25             {
26                 udpSend.Send(bytes, bytes.Length, iep);
27             }
28             catch(Exception ex)
29             {
30                 MessageBox.Show(ex.Message);
31                 return;
32             }
33 
34             this.richTextBox1.Text = "";
35             this.richTextBox1.Focus();
36         }

接收多播消息客户端

1 private void button2_Click(object sender, EventArgs e)
2         {
3             ReceiveMessage(this.richTextBox1);
4         }

用于接收多播消息的ReceiveMessage(RichTextBox textBox)方法

 1  private void ReceiveMessage(RichTextBox textBox)
 2         {
 3             byte[] bytes = null;
 4 
 5             //在本机指定的端口进行接收
 6             udpReceive = new UdpClient(8000);
 7 
 8             //将套接字加入组播组
 9             udpReceive.JoinMulticastGroup(IPAddress.Parse("224.0.0.10"), 50);
10 
11             //接收从远程主机发送过来的消息
12             IPEndPoint iep = new IPEndPoint(IPAddress.Loopback, 0);//这里是本地测试,所以写成环回地址
13             //如果是远程主机,则写成 IPEndPoint iep = new IPEndPoint(IPAddress.Any,0);
14 
15             while(true)
16             {
17                 try
18                 {
19                     bytes = udpReceive.Receive(ref iep);
20                     textBox.Text = Encoding.UTF8.GetString(bytes);
21                     MessageBox.Show(Encoding.UTF8.GetString(bytes));
22                 }
23                 catch(Exception e)
24                 {
25                     MessageBox.Show(e.Message);
26                     return;
27                 }
28             }
29         }

         上面接收的代码逻辑有点问题,因为接收完一次消息,还会一直等着接收下一次消息,会造成阻塞。来个if判断下就行了

        设置端口号时的0是指自动分配

上面加入多播组时用到了TTL

                          TTL的极限约定

初始TTL 约定 初始TTL 约定
0 多播数据报被限制在同一个主机 64 多播数据报被限制在同一个地区
1 多播数据报被限制在同一个子网 128 多播数据报被限制在同一个本土
32 多播数据报被限制在同一个站点 255 没有范围限制

在窗体关闭事件中加上以下代码用来关闭UDP连接

1 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
2         {
3         if(udpReceive != null)
4              udpReceive.Close();
5         }
原文地址:https://www.cnblogs.com/zhaotianff/p/5547255.html