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 中引入)
应用功能
ID_CAP_NETWORKING [Windows Phone] internetClient privateNetworkClientServer

注解

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

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

典型的操作顺序如下:

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

处理异常

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

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

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

将 DatagramSocket 与 Wi-Fi Direct 配合使用

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

在 Windows Server 2012 上使用 DatagramSocket

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

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

dism /online /enable-feature /featurename:ServerMediaFoundation 启用 Media Foundation 功能后,系统会提示用户重启。 重启计算机后, 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");

这些代码片段使用 ConnectAsyncGetOutputStreamAsyncGetEndpointPairsAsync 方法支持类似的用法来连接到服务。

构造函数

DatagramSocket()

创建新的 DatagramSocket 对象。

属性

Control

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

Information

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

OutputStream

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

方法

BindEndpointAsync(HostName, String)

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

BindServiceNameAsync(String)

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

BindServiceNameAsync(String, NetworkAdapter)

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

CancelIOAsync()

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

Close()

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

ConnectAsync(EndpointPair)

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

ConnectAsync(HostName, String)

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

Dispose()

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

EnableTransferOwnership(Guid)

使应用后台任务在应用未处于活动状态时此 DatagramSocket 的流量到达时由套接字代理触发。

EnableTransferOwnership(Guid, SocketActivityConnectedStandbyAction)

当系统处于连接待机状态时,此 DatagramSocket 的流量到达时,允许套接字代理触发应用的后台任务。

GetEndpointPairsAsync(HostName, String)

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

GetEndpointPairsAsync(HostName, String, HostNameSortOptions)

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

GetOutputStreamAsync(EndpointPair)

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

GetOutputStreamAsync(HostName, String)

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

JoinMulticastGroup(HostName)

DatagramSocket 对象联接到多播组。

TransferOwnership(String)

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

TransferOwnership(String, SocketActivityContext)

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

TransferOwnership(String, SocketActivityContext, TimeSpan)

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

事件

MessageReceived

一个事件,指示在 DatagramSocket 对象上收到了消息。

适用于

另请参阅