DatagramSocket 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
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
- 继承
- 属性
- 实现
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 事件处理程序必须在任何绑定或连接操作之前设置,否则会发生错误。
操作的典型顺序如下所示:
- 创建 DatagramSocket。
- 使用 Control 属性检索 DatagramSocketControl 对象并设置任何高级控件。 大多数应用通常不需要此步骤。
- 将 MessageReceived 事件分配给事件处理程序。
- 若要侦听来自任何远程终结点(例如服务器方案)的传入数据包,请调用 BindEndpointAsync 或 BindServiceNameAsync 方法将 DatagramSocket 绑定到本地服务名称或 UDP 端口。
- 若要与单个远程终结点(例如客户端方案)通信,请调用 ConnectAsync 方法,将 DatagramSocket 绑定到特定的远程终结点。
- 每当来自远程终结点的消息到达时,都会调用 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 |
获取要写入远程主机的输出流。 |
方法
事件
| 名称 | 说明 |
|---|---|
| MessageReceived |
指示在 DatagramSocket 对象上收到消息的事件。 |