多播程序设计(基于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 }