使用 UDP 服务

UdpClient 类使用 UDP 与网络服务通信。 UdpClient 类的属性和方法对使用 UDP 创建 Socket 以请求和接收数据的详细信息进行了抽象化处理。

用户数据报协议(UDP)是一个简单的协议,它尽力将数据传送到远程主机。 但是,由于 UDP 协议是一种无连接协议,因此发送到远程终结点的 UDP 数据报不能保证到达,也不能保证它们以发送的相同顺序到达。 使用 UDP 的应用程序必须准备好处理缺失数据报、重复数据报和无序数据报。

若要使用 UDP 发送数据报,必须知道托管所需服务的网络设备的网络地址以及服务用来通信的 UDP 端口号。 Internet 分配号码管理局(IANA)为公用服务定义端口号(请参阅 服务名称和传输协议端口号注册表)。 不在 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 数据报会将消息传送到本地网络段上的任何主机。 由于路由器从不转发发送到此地址的消息,因此只有网段上的主机接收广播消息。

通过设置主机标识符的所有数位,可以将广播定向到网络的特定部分。 例如,若要将广播发送到从 192.168.1 开始由 IP 地址标识的网络上的所有主机,请使用地址 192.168.1.255。

下面的代码示例使用 UdpClient 在端口 11,000 上侦听 UDP 数据报。 客户端接收消息字符串并将消息写入控制台。

Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class UDPListener
   Private Const listenPort As Integer = 11000

   Private Shared Sub StartListener()
      Dim listener As New UdpClient(listenPort)
      Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
      Try
         While True
            Console.WriteLine("Waiting for broadcast")
            Dim bytes As Byte() = listener.Receive(groupEP)
            Console.WriteLine("Received broadcast from {0} :", groupEP)
            Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytes.Length))
         End While
      Catch e As SocketException
         Console.WriteLine(e)
      Finally
         listener.Close()
      End Try
   End Sub 'StartListener

   Public Shared Sub Main()
      StartListener()
   End Sub 'Main
End Class 'UDPListener
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class UDPListener
{
    private const int listenPort = 11000;

    private static void StartListener()
    {
        UdpClient listener = new UdpClient(listenPort);
        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

        try
        {
            while (true)
            {
                Console.WriteLine("Waiting for broadcast");
                byte[] bytes = listener.Receive(ref groupEP);

                Console.WriteLine($"Received broadcast from {groupEP} :");
                Console.WriteLine($" {Encoding.ASCII.GetString(bytes, 0, bytes.Length)}");
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine(e);
        }
        finally
        {
            listener.Close();
        }
    }

    public static void Main()
    {
        StartListener();
    }
}

下面的代码示例使用 Socket 端口 11,000 将 UDP 数据报发送到定向广播地址 192.168.1.255。 客户端发送命令行中指定的消息字符串。

Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Program
    Public Shared Sub Main(args() As [String])
      Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
      s.EnableBroadcast = True
      Dim broadcast As IPAddress = IPAddress.Parse("192.168.1.255")
      Dim sendbuf As Byte() = Encoding.ASCII.GetBytes(args(0))
      Dim ep As New IPEndPoint(broadcast, 11000)
      s.SendTo(sendbuf, ep)
      Console.WriteLine("Message sent to the broadcast address")
   End Sub 'Main
End Class
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        s.EnableBroadcast = true;

        IPAddress broadcast = IPAddress.Parse("192.168.1.255");

        byte[] sendbuf = Encoding.ASCII.GetBytes(args[0]);
        IPEndPoint ep = new IPEndPoint(broadcast, 11000);

        s.SendTo(sendbuf, ep);

        Console.WriteLine("Message sent to the broadcast address");
    }
}

另请参阅