多播程序设计(基于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 | 组织内部使用,用于限制多播范围 |
服务器端:

private UdpClient udpSend;
private void button1_Click(object sender, EventArgs e)
{
//判断是否为空
if(this.richTextBox1.Text == "")
{
MessageBox.Show("Please input the text");
return;
}
//初始始UdpClient
udpSend = new UdpClient();
//允许发送和接收广播数据报
udpSend.EnableBroadcast = true;
//必须使用组播地址范围内的地址
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("224.0.0.10"), );
byte[] bytes = Encoding.UTF8.GetBytes(this.richTextBox1.Text);
//发送组播信息
try
{
udpSend.Send(bytes, bytes.Length, iep);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
this.richTextBox1.Text = "";
this.richTextBox1.Focus();
}
接收多播消息客户端

private void button2_Click(object sender, EventArgs e)
{
ReceiveMessage(this.richTextBox1);
}
用于接收多播消息的ReceiveMessage(RichTextBox textBox)方法
private void ReceiveMessage(RichTextBox textBox)
{
byte[] bytes = null; //在本机指定的端口进行接收
udpReceive = new UdpClient(); //将套接字加入组播组
udpReceive.JoinMulticastGroup(IPAddress.Parse("224.0.0.10"), ); //接收从远程主机发送过来的消息
IPEndPoint iep = new IPEndPoint(IPAddress.Loopback, );//这里是本地测试,所以写成环回地址
//如果是远程主机,则写成 IPEndPoint iep = new IPEndPoint(IPAddress.Any,0); while(true)
{
try
{
bytes = udpReceive.Receive(ref iep);
textBox.Text = Encoding.UTF8.GetString(bytes);
MessageBox.Show(Encoding.UTF8.GetString(bytes));
}
catch(Exception e)
{
MessageBox.Show(e.Message);
return;
}
}
}
上面接收的代码逻辑有点问题,因为接收完一次消息,还会一直等着接收下一次消息,会造成阻塞。来个if判断下就行了
设置端口号时的0是指自动分配
上面加入多播组时用到了TTL
TTL的极限约定
| 初始TTL | 约定 | 初始TTL | 约定 |
| 0 | 多播数据报被限制在同一个主机 | 64 | 多播数据报被限制在同一个地区 |
| 1 | 多播数据报被限制在同一个子网 | 128 | 多播数据报被限制在同一个本土 |
| 32 | 多播数据报被限制在同一个站点 | 255 | 没有范围限制 |
在窗体关闭事件中加上以下代码用来关闭UDP连接
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if(udpReceive != null)
udpReceive.Close();
}
多播程序设计(基于UDP协议)的更多相关文章
- 基于UDP协议模拟的一个TCP协议传输系统
TCP协议以可靠性出名,这其中包括三次握手建立连接,流控制和拥塞控制等技术.详细介绍如下: 1. TCP协议将需要发送的数据分割成数据块.数据块大小是通过MSS(maximum segment siz ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- JAVA基础知识之网络编程——-基于UDP协议的通信例子
UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramS ...
- 基于UDP协议的控制台聊天
这几天学了java的网络编程弄出一个基于UDP协议的聊天工具 功能 添加并且备注好友(输入对方的ip) 删除好友 查看好友列表 用java写的控制台程序导出可执行程序后不能双击打开 还需要些一个脚本文 ...
- 基于UDP协议的网络编程
UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象. Java使用DatagramSock ...
- 网络编程应用:基于UDP协议【实现文件下载】--练习
要求: 基于UDP协议实现文件下载 发送方–请求–接收方发送文件–发送方接收文件 代码: 发送方: package Homework1; import java.io.File; import jav ...
- 基于UDP协议的socket编程
UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启 ...
- 基于UDP协议的控制台聊天程序(c++版)
本博客由Rcchio原创,转载请告知作者 ------------------------------------------------------------------------------- ...
- Learning-Python【30】:基于UDP协议通信的套接字
UDP协议没有粘包问题,但是缓冲区大小要足够装数据包大小,建议不要超过 512 服务端: # 服务端 import socket server = socket.socket(socket.AF_IN ...
- python 全栈开发,Day34(基于UDP协议的socket)
昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...
随机推荐
- 屠龙之路_任生活如何虐你,屠龙之路还得继续_SeventhDay
摘要 :屠龙少年在"罢工"了一天,在周末客栈补给和放纵之后,突然想起来说好的和公主私奔呢?(此处出现了为何上篇随笔不见公主)咋想之下,貌似公主还在恶龙Alpha的手中.为此,屠龙少 ...
- 对C语言中指针的一些新认识
学C语言这么久了,才发现指针不是想象中那么简单,当初根本就没理解指针怎么用! 变量--是由操作系统自动分配存储空间的 指针--手动分配存储空间或指向已有变量的地址 指针中的内容需要手动释放,而变 ...
- 【PKUSC 2015的一道数学题】
有9个人,每三个人中至少有两个互相认识,求证这里面至少有4个人互相认识 PKU官方题解: 引理:二染色K6中一定有同色K3. 证明:考虑某一个点,它一定连出至少三条同色边(不妨设为红边),这三条边连的 ...
- JS跳出框架返回上一页
链接部分 <a class="link" href="javascript:;" target="_top" onclick=&quo ...
- 02python算法-递推
递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3 ...
- 安装centos虚拟机
启动虚拟机提示"无法连接虚拟设备ide1:0,主机上没有相对应的设备" 进入编辑虚拟机设置--选中硬盘--点高级--在 虚拟机设备节点中选ide0:0接行了.
- 控制浏览器高度 宽度 只能支持ie
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- 数据结构之二分查找(PHP)
<?php //二分查找算法 //前提:索引数组.数组已排好顺序 $a=array(1,3,4,6,8,9,11,13,15,24,25,27,30,38); $search = 30;//要查 ...
- 自定义cell的一些知识
1.要往cell里面添加一个自定义的子控件,都是添加到cell的contentView,不是添加到cell里面. 2.通过xib自定义cell * 添加tableView * 加载团购数据 * 新建x ...
- OPENGL之定时器
定时器一般用于控制隔一段时间调用某函数 函数原型glutTimerFunc(unsigned int msecs,void(*func)(int value),int value) 说明:msecs为 ...