您的位置:首页 > 其它

UDP 组播 广播

2010-11-17 23:09 176 查看
最近在写一段分布式即时聊天的程序,为了实现内网用户正常通信,考虑使用组播的方式实现数据“广播”

根据查询的资料来看,UDP广播只能在内网(同一网段)有效,而组播可以较好实现跨网段群发数据。

简介

IP网络传输方式共分为单播,组播(多播),广播三种。平时我们最常用的一对一的网络传输方式就是属于单播;而组播是一对多的传输方式,其中有个组播组的
概念,发送端将数据向一个组内发送,网络中的路由器通过底层的IGMP协议自动将数据发送到所有监听这个组的终端。至于广播则和组播有一些相似,
区别是路由器向子网内的每一个终端都投递一份数据包,不论这些终端是否乐于接收该数据包。

相对于极度消耗网络带宽的广播来说(广播只能在内网广播),UDP组播有了很大的优化,只有终端加入到了一个广播组,UDP组播的数据才能被他接收到。
UDP组播是采用的无连接,数据报的连接方式,所以是不可靠的。也就是数据能不能到达接受端和数据到达的顺序都是不能保证的。但是由于UDP不用保证数据
的可靠性,所有数据的传送速度是很快的。

IP组播地址

IP组播通信需要一个特殊的组播地址,IP组播地址是一组D类IP地址,范围从224.0.0.0 到
239.255.255.255。其中还有很多地址是为特殊的目的保留的。224.0.0.0到224.0.0.255的地址最好不要用,因为他们大多是
为了特殊的目的保持的(比如IGMP协议)

IGMP协议

IGMP是IP组播的基础。在IP协议出现以后为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有
人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A和B要
进行组播通信,那么位于AB之间的所有路由器必须都要支持IGMP协议,否则AB之间不能进行通信。

UDP组播的基本步骤

建立socket

socket和端口绑定

加入一个组播组

通过sendto / recvfrom进行数据的收发

关闭socket

Send示例

IPAddress ip = IPAddress.Parse("224.1.2.3");

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 1);

IPEndPoint ipep = new IPEndPoint(ip, 5000);

......

s.SendTo(buff, buff.Length, SocketFlags.None, ipep);

......

s.Close();

Recv示例

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5000);

s.Bind(ipep);

s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,

new MulticastOption(IPAddress.Parse("224.1.2.3"), IPAddress.Any));

......

s.Receive(b, 4, SocketFlags.None);

......

s.Close();

Example: UDPMulticast.7z
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: