语言

DatagramSocket 类

定义

支持使用 UDP 数据报套接字进行网络通信。

有关代码示例,请参阅 套接字。

public ref class DatagramSocket sealed : IClosable
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DatagramSocket final : IClosable
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
class DatagramSocket final : IClosable
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class DatagramSocket : System.IDisposable
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
public sealed class DatagramSocket : System.IDisposable
function DatagramSocket()
Public NotInheritable Class DatagramSocket
Implements IDisposable
继承
Object Platform::Object IInspectable DatagramSocket
属性
实现

Windows 要求

要求 说明
设备系列
Windows 10 (在 10.0.10240.0 中引入)
API contract
Windows.Foundation.UniversalApiContract (在 v1.0 中引入)
应用功能
internetClient privateNetworkClientServer

注解

DatagramSocket 类支持使用 UDP 数据报套接字进行网络通信。 DatagramSocket 对象可用于发送 UDP 数据包的客户端应用或侦听传入 UDP 数据的服务器应用。

使用 DatagramSocket 对象发送或接收数据需要执行几个步骤。 应用首先将 MessageReceived 事件分配给事件处理程序。 若要侦听来自远程终结点(例如服务器方案)的传入数据包,应用会调用 BindEndpointAsync 或 BindServiceNameAsync 方法将 DatagramSocket 绑定到本地服务名称或 UDP 端口。 但是,当应用需要与单个远程终结点(例如客户端方案)通信时,应用会调用 ConnectAsync 方法。 MessageReceived 事件处理程序必须在任何绑定或连接操作之前设置,否则会发生错误。

操作的典型顺序如下所示:

  1. 创建 DatagramSocket。
  2. 使用 Control 属性检索 DatagramSocketControl 对象并设置任何高级控件。 大多数应用通常不需要此步骤。
  3. 将 MessageReceived 事件分配给事件处理程序。
  4. 若要侦听来自任何远程终结点(例如服务器方案)的传入数据包,请调用 BindEndpointAsync 或 BindServiceNameAsync 方法将 DatagramSocket 绑定到本地服务名称或 UDP 端口。
  5. 若要与单个远程终结点(例如客户端方案)通信,请调用 ConnectAsync 方法,将 DatagramSocket 绑定到特定的远程终结点。
  6. 每当来自远程终结点的消息到达时,都会调用 MessageReceived 事件处理程序。 此类还可用于加入多播组并将 UDP 数据包发送到多播组。 有关详细信息,请参阅 JoinMulticastGroup 方法。

处理异常

在 DatagramSocket 类上调用异步方法时,必须编写代码来处理异常。 异常可能是由参数验证错误、名称解析失败和网络错误导致的。 网络错误(例如连接丢失、连接失败和服务器故障)可能会随时发生异常。 这些错误会导致引发异常。 如果应用未处理,异常可能会导致整个应用被运行时终止。

Windows.Networking.Sockets 命名空间具有一种方便的帮助程序方法和枚举,用于在使用套接字时处理错误。 这可用于在应用中以不同的方式处理特定网络异常。 应用还可以使用来自参数验证错误的异常 HRESULT,了解有关导致异常的错误的更多详细信息。

有关可能的异常以及如何处理异常的详细信息,请参阅 处理网络应用中的异常。

将 DatagramSocket 与 Wi-Fi Direct 配合使用

你的应用可以使用 DatagramSocket 在使用 Windows.Devices.WiFiDirect 命名空间中的类 Wi-Fi Direct 的设备之间进行网络数据传输。 WiFiDirectDevice 类可用于查找具有 Wi-Fi Direct(WFD)功能设备的其他设备。 WiFiDirectDevice.GetDeviceSelector 方法获取附近 WFD 设备的设备标识符。 获取对附近 WFD 设备的引用后,可以调用 WiFiDirectDevice.GetConnectionEndpointPairs 方法来获取 EndpointPair 对象。 DatagramSocket 类上的方法可用于向 EndpointPair 对象发送和接收数据。 有关详细信息,请参阅 Windows.Devices.WiFiDirect 和 WiFiDirectDevice。

在 Windows Server 2012 上使用 DatagramSocket

在 Windows Server 2012 和 Windows Server 2012 R2 上,在 Windows.Networking.Sockets 命名空间中实现大部分类的 Windows.Networking.dll 将无法加载,除非启用了 Media Foundation 功能。 因此,如果媒体基础功能被禁用,Windows.Networking.Sockets 命名空间中使用 DatagramSocket 和相关套接字类的应用将失败。 禁用 Media Foundation 功能的 Windows Server 2012 或 Windows Server 2012 R2 安装。

可以使用服务器管理器或在命令提示符或脚本中输入以下文本,在 Windows Server 2012 或 Windows Server 2012 R2 上启用 Media Foundation 功能:

dism /online /enable-feature /featurename:ServerMediaFoundation 启用媒体基础功能后,系统会提示用户重启。 重启计算机后,Windows.Networking.Sockets 命名空间中套接字和 WebSocket 的类将按预期工作。

使用 DatagramSocket 解析 DNS 服务记录

应用可以与属于 SRV 记录的目标 DNS 地址通信。 例如,Contoso 域中通过网络地址转换(NAT)(STUN)服务的 UDP 简单遍历对应于 _stun._udp.contoso.com。 该服务名称对应于服务器 DNS 名称,例如 stunServer01.contoso.com。

若要连接到该服务服务器的 DNS 地址,请使用 DatagramSocket 实例上的以下方法调用:

using Windows.Networking.Sockets;

DatagramSocket socket = new DatagramSocket();
socket.ConnectAsync(new HostName("contoso.com"), "stun");

该协议被推断为 DatagramSocket 实例的 UDP。 该方法处理下划线字符。

DNS 可配置为具有 SRV 层次结构。 DNS SRV 资源记录可以采用以下形式:_stun._service01._udp.contoso.com。 对于此示例,对 DatagramSocket 实例使用以下方法调用:

socket.ConnectAsync(new HostName("contoso.com"), "stun._service01");

这些代码片段使用 ConnectAsync。 GetOutputStreamAsync 和 GetEndpointPairsAsync 方法支持与服务类似的用法。

构造函数

名称 说明
DatagramSocket()

创建新的 datagramSocket 对象 。

属性

名称 说明
Control

获取 DatagramSocket 对象的套接字控制数据。

Information

获取 DatagramSocket 对象的本地和远程主机名以及本地和远程服务名称的套接字信息。

OutputStream

获取要写入远程主机的输出流。

方法

名称 说明
BindEndpointAsync(HostName, String)

启动对 DatagramSocket 到本地主机名和本地服务名称的绑定操作。

BindServiceNameAsync(String, NetworkAdapter)

在 DatagramSocket 上启动绑定到本地服务名称和特定网络接口的绑定操作。

BindServiceNameAsync(String)

对 DatagramSocket 启动绑定到本地服务名称的绑定操作。

CancelIOAsync()

取消对 DatagramSocket 对象的挂起读取和写入。

Close()

关闭 DatagramSocket 对象,并中止对 DatagramSocket的任何挂起操作。

ConnectAsync(EndpointPair)

在指定为 EndpointPair 对象的远程网络目标 DatagramSocket 上启动连接操作。

ConnectAsync(HostName, String)

在 DatagramSocket 上启动连接操作,以连接到由远程主机名和远程服务名称指定的远程目标。

Dispose()

执行与释放、释放或重置非托管资源关联的应用程序定义任务。

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

当此 DatagramSock et 的流量在系统处于连接待机状态时到达时,使应用的后台任务可由套接字代理触发。

EnableTransferOwnership(Guid)

当此 DatagramSock et 的流量在应用未处于活动状态时到达时,允许套接字代理触发应用的后台任务。

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

根据远程主机名和远程服务名称以及要使用的排序顺序获取 EndpointPair 对象的列表。

GetEndpointPairsAsync(HostName, String)

根据远程主机名和远程服务名称获取 EndpointPair 对象的列表,该名称可用于将数据报发送到远程网络目标。

GetOutputStreamAsync(EndpointPair)

启动一个操作,以便 IOutputStream 到 EndpointPair 对象指定的远程网络目标,该对象随后可用于发送网络数据。

GetOutputStreamAsync(HostName, String)

启动一个操作,将 IOutputStream 到远程主机名指定的远程目标,以及随后可用于发送网络数据的远程服务名称。

JoinMulticastGroup(HostName)

将 DatagramSocket 对象联接到多播组。

TransferOwnership(String, SocketActivityContext, TimeSpan)

将 DatagramSocket 所有权转移到套接字代理服务,该服务监视套接字活动,并在有任何活动时通过后台任务通知应用。

TransferOwnership(String, SocketActivityContext)

将 DatagramSocket 所有权转移到套接字代理服务,该服务监视套接字活动,并在有任何活动时通过后台任务通知应用。

TransferOwnership(String)

将 DatagramSocket 所有权转移到套接字代理服务,该服务监视套接字活动,并在有任何活动时通过后台任务通知应用。

事件

名称 说明
MessageReceived

指示在 DatagramSocket 对象上收到消息的事件。

适用于

另请参阅