UDPClient 类使用 UDP 与网络服务通讯。UdpClient 类的属性和方法提取某个 Socket 实例的创建细节,该示例用于通过 UDP 请求和接收数据。
UDP 的优点是简单易用,并且能够同时向多个地址广播消息。但由于 UDP 协议是一个无连接协议,因此发送到远程终结点的 UDP 数据文报不一定能够到达,也不一定能够以发送的相同顺序到达。使用 UDP 的应用程序必须准备处理丢失的和顺序有误的数据文报。
若要使用 UDP 发送数据文报,必须知道承载所需服务的网络设备的网络地址以及该服务用于通讯的 UDP 端口号。Internet 分配号码机构 (Internet Assigned Numbers Authority, IANA) 定义公共服务的端口号(请访问 http://www.iana.org/assignments/port-numbers)。IANA 列表中所没有的服务可使用 1,024 到 65,535 这一范围中的端口号。
特殊网络地址用于支持基于 IP 的网络上的 UDP 广播消息。下面探讨的内容以 Internet 上使用的 IP 版本 4 地址族作为示例。
IP 版本 4 地址使用 32 位指定网络地址。对于使用 255.255.255.0 网络掩码的 C 类地址,这些位被分为四个八位字节。当以十进制数表示时,这四个八位字节构成熟悉的以点分隔的四部分表示法,如 192.168.100.2。前两个八位字节(此示例中为 192.168)构成网络号;第三个八位字节 (100) 定义子网;最后一个八位字节 (2) 是主机标识符。
将 IP 地址的所有位均设置为 1(即 255.255.255.255)可构成有限的广播地址。将 UDP 数据文报发送到此地址可将消息传递到该广播网络上的任何主机。由于路由器从不转发发送到此地址的消息,因此只有已连接的网络上的主机才可看到这些广播。
通过将部分地址的所有位全都设置为 1,可以将广播定向到特定的网络部分。例如,若要将广播发送到以 192.168 打头的 IP 地址标识的网络上的所有主机,请将地址的子网和主机部分全都设置为 1,如 192.168.255.255。若要将广播限制在单个子网,则只将主机部分设置全都为 1,如 192.168.100.255。
UdpClient 类可向任何网络广播地址广播,但它无法侦听发送到网络的广播。必须使用 Socket 类才能侦听网络广播。
当所有接收者都位于单个网络中时,或者当许多客户端需要接收广播时,广播地址将起作用。当接收者为网络的一小部分时,应将消息发送到多路广播组,在那里只有加入此组的客户端才能接收到消息。范围从 224.0.0.2 到 244.255.255.255 的 IP 地址保留为主机组地址。IP 号 224.0.0.0 被保留,而 224.0.0.1 分配给所有 IP 主机的固定组。
下面的示例使用 UdpClient 侦听端口 11000 上的多路广播地址组 224.168.100.2 的 UDP 数据文报广播。它接收消息字符串并将消息写入控制台。
[C#]
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class UDPMulticastListener
{
private static readonly IPAddress GroupAddress =
IPAddress.Parse("224.168.100.2");
private const int GroupPort = 11000;
private static void StartListener()
{
bool done = false;
UdpClient listener = new UdpClient();
IPEndPoint groupEP = new IPEndPoint(GroupAddress,GroupPort);
try {
listener.JoinMulticastGroup(GroupAddress);
listener.Connect(groupEP);
while (!done)
{
Console.WriteLine("Waiting for broadcast");
byte[] bytes = listener.Receive( ref groupEP);
Console.WriteLine("Received broadcast from {0} :\n {1}\n",
groupEP.ToString(),
Encoding.ASCII.GetString(bytes,0,bytes.Length));
}
listener.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
public static int Main(String[] args)
{
StartListener();
return 0;
}
}
下面的示例使用 UdpClient 将 UDP 数据文报发送到端口 11000 上的多路广播地址组 224.268.100.2。它发送命令行上指定的消息字符串。
[C#]
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class UDPMulticastSender
{
private static IPAddress GroupAddress =
IPAddress.Parse("224.168.100.2");
private static int GroupPort = 11000;
private static void Send( String message)
{
UdpClient sender = new UdpClient();
IPEndPoint groupEP = new IPEndPoint(GroupAddress,GroupPort);
try
{
Console.WriteLine("Sending datagram : {0}", message);
byte[] bytes = Encoding.ASCII.GetBytes(message);
sender.Send(bytes, bytes.Length, groupEP);
sender.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
public static int Main(String[] args)
{
Send(args[0]);
return 0;
}
}