C# 中的 IP 多播






4.83/5 (40投票s)
2002年1月2日
4分钟阅读

555059

22405
C# .NET 框架中组播的简单客户端/服务器实现
引言
本文档提供了一个简单的客户端/服务器示例,用于在 C# .NET 中设置组播应用程序,并解释了组播的工作原理、其当前的有用性以及随着带宽的不断增加和流媒体的日益普及,它将如何成为未来数据传输的决定性方法。
什么是 IP 组播
“IP 组播是一种节省带宽的技术,通过将单一数据流同时传输给成千上万的企业收件人和家庭来减少流量。” CSCO01。
组播的概念可以被认为是与地面和卫星电视广播相同;有一个单一的卫星或发射塔和许多接收器。这是因为没有到源的后端通道,并且到接收器的路径上的路由器能够创建该流的多个副本,以传递给路由上的其他路由器和主机。这个过程运行良好,因为互联网的实现类似于开车从一个国家到另一个国家,您将遵循各种路线并在必要时加入新的路线,这些路线都在通往您目的地的途中。
IP 组播的要求
在开发组播应用程序或迁移单播应用程序之前,需要具备一些条件。
网络要求
为了使 IP 组播正常工作,通信路径上的所有路由器都必须启用组播。对于互联网组播,设备必须传输并且是 MBONE 的成员,MBONE 基本上是一个支持 IP 组播流量的虚拟网络中的设备组。MBONE 最多是一个临时的实用程序,未来所有启用组播的设备,随着越来越多的制造商生产支持组播的路由器,MBONE 将逐渐消失,成为互联网的另一部分。
系统要求
操作系统网络接口必须支持组播。Berkeley Sockets、Windows Sockets 2 和 Apple Macintosh Open Transport 都支持组播 - 我猜这很重要,因为 .NET 将(希望)最终被移植到所有这些操作系统。
IP 组播应用程序
RFC1112“IP 组播主机扩展”(http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc1112.html)推荐了许多应可用的组播支持 API 调用。这些是
- 加入组播组
- 离开组播组
- 设置组播组的 TTL(生存时间)
本文档附带的示例将演示这些 .NET Framework API 调用中的每一个。
向组播组发送数据
要使计算机向组播组发送数据,应用程序必须加入组播组,为数据定义 TTL,然后将信息发送到组。这在下面以编程方式显示
Socket s=new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
我们首先创建一个套接字,就像我们创建普通单播 UDP 套接字一样。
IPAddress ip=IPAddress.Parse("224.5.6.7");
现在我们需要加入一个组播组。组播 IP 地址属于 Class D 范围 224.0.0.0-239.255.255.255 - 我们可以加入其中任何一个地址,但大多数我们将使用 224.5.6.7 作为示例。
s.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership, new MulticastOption(ip));
我们现在发出加入命令,一旦我们加入,套接字将成为组播组 224.5.6.7 的成员。
s.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastTimeToLive, 2);
这会设置套接字的生存时间 (TTL) - 这对于定义组播数据的范围非常重要。设置值为 1 意味着组播数据不会离开本地网络,设置任何高于此值的值将允许组播数据通过几个路由器,每个路由器会将 TTL 减 1。获得正确的 TTL 值对于带宽考虑非常重要。
IPEndPoint ipep=new IPEndPoint(ip, 4567);
s.Connect(ipep);
这创建了允许我们发送组播数据的终结点,我们将套接字连接到该终结点。我们现在是组播组的正式成员,可以向其发送数据。
// This creates the letters ABCDEFGHIJ
byte[] b=new byte[10];
for(int x=0;x<b.Length;x++) b[x]=(byte)(x+65);
s.Send(b,b.Length,SocketFlags.None);
s.Close();
我们现在已将字符串 ABCDEFGHIJ
发送到端口 4567 上的组播组 224.5.6.7。所有侦听此端口的应用程序都将收到这些数据。
从组播组接收数据
在 C# 中,接收数据比发送数据更容易设置。
Socket s=new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
我们以与单播 UDP 套接字相同的方式设置套接字。
IPEndPoint ipep=new IPEndPoint(IPAddress.Any, 4567);
s.Bind(ipep);
我们创建一个 IP 终结点,用于将端口 4567 上的任何 IP 地址的传入数据绑定到套接字。
IPAddress ip=IPAddress.Parse("224.5.6.7");
s.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership,
new MulticastOption(ip,IPAddress.Any));
套接字被添加到组播组 224.5.6.7。
byte[] b=new byte[1024];
s.Receive(b);
string str = System.Text.Encoding.ASCII.GetString(b,0,b.Length);
Console.WriteLine(str.Trim());
现在我们可以接收发送到此组播组的任何数据。
额外资源
IP 组播有很多资源,下面列出了一些
- IPMI - http://www.ipmulticast.com/
- 南加州大学组播 - http://netweb.usc.edu/multicast/
- RFC1112 - http://www.cis.ohio-state.edu/cgi-bin/rfc/rfc1112.html
参考文献
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。