C#实现任意源组播与特定源组播

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;

(2)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();

(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();

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);

http://m.blog.csdn.net/article/details?id=11715903

时间: 2024-11-04 17:34:28

C#实现任意源组播与特定源组播的相关文章

H3C组播系列之IP组播概述

一.组播的基本介绍 组播指发送源将产生的单一IP数据包通过网络发送给一组特定接收者的网络传输方式.组播结合了单播和广播的优点,在进行点到多点传输时,发送源不需要关心接受者的数目,仅需要发送一份报文:路由器仅关心接口下是否有接收者,同样不需要关心接收者的数量,所以在路由器之间的链路上也仅传送一份报告. 和单播相比,组播减轻了发送源的负担,并且提高了链路的有效利用率.此外,发送源可以同时发送报文给多个接收者,可以满足低延时应用的需求. 和广播相比,组播方式下路由器仅在有接收者的接口复制报文,报文最终

组播学习笔记(四)组播分发树简述+组播防环

组播拓扑: 从第一跳路由器(FH)到最后一条路由器(LH)中间会形成一个组播分发树. 组播分发树有两种模型: 1.源树模型:从源到接受者计算出一条最短路径. 如source1到host1走的路径是:source1-->A-->C-->host1 source1到host2走的路径是:source1-->A-->C-->E-->host2 source2到host1走的路径是:source2-->F-->D-->C-->host1 sourc

只允许特定的组用户su切换到root

linux系统root具有至高无上的权限,工作生产环境或者VPS一般为了安全起见,禁止root登录,禁止root用户权限,使用普通用户登录,有特殊需求可以su或sudo切换到root权限进行操作,下面介绍一个方法只允许特定的组用户su切换到root: 1.新建普通用户,比如baby useradd  baby 2.修改密码 passwd baby 3.将帐号加入wheel组 usermod -G wheel baby 4.设置只允许这个组的帐号,使用su命令切换到root vi /etc/pam

3D轮播切换特效 源码

这个3D轮播切换特效是我2017年2月份写的 当初我 刚接触HTML不久,现在把源码分享给大家 源码的注释超级清楚 . <!-- 声明文档类型:html 作用:符合w3c统一标准规范 每个浏览器对html css js都有自己的编码模式(兼容模式)--> 无序列表标签  盒子模型标签  img图片标签四要素 1 <!-- 2 声明文档类型:html 3 作用:符合w3c统一标准规范 4 每个浏览器对html css js都有自己的编码模式(兼容模式) 5 --> 6 <!do

Linux上查看用户名和组并把特定用户放到特定的组之下

cat /etc/passwd             //查看所有的用户信息 cat /etc/passwd|grep 用户名       //查看某一个用户的信息 cat /etc/group   //查看所有的组信息 cat /etc/group|grep 组名   //查看某一个组名的信息 groups //查看当前登录用户的组内成员 groups test //查看test用户所在的组,以及组内成员 whoami //查看当前登录用户名 为新添加用户找一个组 groupadd deve

【 js 基础 】【 源码学习 】backbone 源码阅读(三)

最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-study)进行参考交流,有详细的源码注释,以及知识总结,同时 google 一下 backbone 源码,也有很多优秀的文章可以用来学习. 我这里主要记录一些偏设计方向的知识点.这篇文章主要讲 backbone.sync 中用到的 Rest 和 CRUD. 首先我们简单了解一下 REST: REST :

转:【Java集合源码剖析】Vector源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/35793865   Vector简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境. Vector没有丝线Serializable接口,因此它不支持序列化,实现了Cloneable接口,能被克隆,实

cocos2d-x 源码分析 : control 源码分析 ( 控制类组件 controlButton)

源码版本来自3.1rc 转载请注明 cocos2d-x源码分析总目录 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结构 control的设计整体感觉挺美的,在父类control定义了整个控制事件的基础以及管理,虽然其继承了Layer,但其本身和UI组件的实现并没有关联.在子类(controlButton,controlSwitch,controlStepper等中实现不同的UI组件).下面通过源码来分析control与

转:【Java集合源码剖析】LinkedList源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/35787253   您好,我正在参加CSDN博文大赛,如果您喜欢我的文章,希望您能帮我投一票,谢谢! 投票地址:http://vote.blog.csdn.net/Article/Details?articleid=35568011 LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使