C#实现任意源组播与特定源组播
来源:互联网 发布:vb 日期格式转string 编辑:程序博客网 时间:2024/06/05 15:21
IP组播通信需要一个特殊的组播地址,IP组播地址是一组D类IP地址,范围从224.0.0.0 到 239.255.255.255。其中还有很多地址是为特殊的目的保留的。224.0.0.0到224.0.0.255的地址最好不要用,因为他们大多是为了特殊的目的保持的(比如IGMP协议)。
IGMP是IP组播的基础。在IP协议出现以后为了加入对组播的支持,IGMP产生了。IGMP所做的实际上就是告诉路由器,在这个路由器所在的子网内有 人对发送到某一个组播组的数据感兴趣,这样当这个组播组的数据到达后面,路由器就不会抛弃它,而是把他转送给所有感兴趣的客户。假如不同子网内的A和B要 进行组播通信,那么位于AB之间的所有路由器必须都要支持IGMP协议,否则AB之间不能进行通信。
1 使用Socket实现任意源组播
利用C#实现UDP组播的基本步骤为:
(1)建立socket;
(1)建立socket;
(2)socket和端口绑定;
(3)加入一个组播组国;
(4)通过sendto / recvfrom进行数据的收发;
(5)关闭socket。
(3)加入一个组播组国;
(4)通过sendto / recvfrom进行数据的收发;
(5)关闭socket。
下面是简单的示例:
(1)发送示例:
IPAddress ip = IPAddress.Parse("226.1.1.2");
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();
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();
(2)接收示例:
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5980);
s.Bind(ipep);
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption(IPAddress.Parse("226.1.1.2"), IPAddress.Any));
......
s.Receive(b, 4, SocketFlags.None);
......
s.Close();
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5980);
s.Bind(ipep);
s.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption(IPAddress.Parse("226.1.1.2"), IPAddress.Any));
......
s.Receive(b, 4, SocketFlags.None);
......
s.Close();
2 使用Socket实现特定源组播
特定源组播(Source Specific Multicast, SSM)提供给主机应用程序一个“通道”抽象,每个通道拥有一个源和多个接收者。组播源可以发送一个IP报文给SSM目的地址G,接受者可以加入通道(S,G)来接收该报文。IPv4地址范围232/8已经被IANA分配给SSM服务。使用C#实现特定源组播时,需要设置SocketOption参数,具体设置如下: byte[] membershipAddresses = new byte[12]; // 3 IPs * 4 bytes (IPv4)
Buffer.BlockCopy(multicastIp.GetAddressBytes(), 0, membershipAddresses, 0, 4); //组播地址
Buffer.BlockCopy(sourceIp.GetAddressBytes(), 0, membershipAddresses, 4, 4); //组播源地址
Buffer.BlockCopy(localIp.GetAddressBytes(), 0, membershipAddresses, 8, 4); //本地接收地址
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddSourceMembership, membershipAddresses);
Buffer.BlockCopy(multicastIp.GetAddressBytes(), 0, membershipAddresses, 0, 4); //组播地址
Buffer.BlockCopy(sourceIp.GetAddressBytes(), 0, membershipAddresses, 4, 4); //组播源地址
Buffer.BlockCopy(localIp.GetAddressBytes(), 0, membershipAddresses, 8, 4); //本地接收地址
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddSourceMembership, membershipAddresses);
- C#实现任意源组播与特定源组播
- C#实现任意源组播与特定源组播
- C#实现任意源组播与特定源组播
- C#中实现byte[]与任意对象互换(服务端通讯专用)
- C#中实现byte[]与任意对象互换(服务端通讯专用)
- C#实现图片的任意四边形变形
- C#中如何删除字符串中任意位置的特定的字符
- c#中实现打印指定页(特定页), 附原代码
- C#实现读取字符串特定字符位置后面的数据
- 在C#用GDI+实现图形图像的任意变形效果?
- C# 实现控制台应用程序按任意键退出
- C# 实现图片任意裁剪以及羽化功能
- C#实现任意角度旋转图片(方法1)
- C#实现任意角度旋转图片(方法2)
- C#中实现任意类的完美克隆
- C#实现任意角度旋转图片(方法1)
- C#实现任意角度旋转图片(方法2)
- 一个坐标点围绕任意中心点旋转--C#实现
- 实现一个新浪微博 MID 转换算法
- IT外企那点儿事(21): 为什么受伤的总是我
- 7 WARNING Signs You Chose the Wrong Job
- 关于memset的使用
- Android: couldn't save which view has focus because the focused view ### has no
- C#实现任意源组播与特定源组播
- 逻辑问题
- Oracle 技术网
- Android移植技术!
- JNI介绍
- IT外企那点儿事(22): 跳槽小技巧
- Android显示GIF动画完整示例(二)
- Woring Practice -每次修改进行code review
- 函数的覆盖和隐藏