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

最新文章

  1. mysql 常用函数整理
  2. Linux文件的建立、复制、删除和移动命令
  3. Wix 安装部署(一)同MSBuild 自动生成打包文件
  4. windows下配置Faster-RCNN
  5. python 中分支结构(switch)
  6. 网络资源管理系统LANsurveyor实战体验
  7. ZOJ 3596Digit Number(BFS+DP)
  8. How to check “hasRole” in Java Code with Spring Security?
  9. Windows内存小结(有好多图,比较清楚)
  10. (转)js 正则表达式之test函数讲解
  11. git-daemon的快捷搭建
  12. vue原来可以这样上手
  13. 软件工程first homework
  14. position(3rd week blog)
  15. js计算本地时间
  16. Java的XML解析
  17. git pull 提示 There is no tracking information for the current branch
  18. spingboot @EnableScheduling
  19. API网关Kong系列(三)添加服务
  20. Centos7.4简单安装使用gitlab+maven+jenkins实现java代码的持续集成部署

热门文章

  1. webcollector 2.x 爬取搜狗搜索结果页
  2. Android分享介绍
  3. 卷积与反卷积、步长(stride)与重叠(overlap)
  4. 微信小程序预览图片
  5. APP压力測试新手教程
  6. Callable,Runnable异同
  7. 深入了解Java虚拟机
  8. 今天用pro安装nginx+php+mysql出现故障的解决方法
  9. Windows 10 子系统Linux重启(不重启Win10)
  10. WPF中制作立体效果的文字或LOGO图形(续)