zoukankan      html  css  js  c++  java
  • 多播程序设计(基于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         }
  • 相关阅读:
    python 随机字符串
    Ajax
    Django (Form)
    Django (项目)
    Django (二)
    Django (一)
    Django 学生管理系统
    地理坐标系 与 投影坐标系
    shapefile
    图表绘制工具--Matplotlib 3
  • 原文地址:https://www.cnblogs.com/zhaotianff/p/5547255.html
Copyright © 2011-2022 走看看