Icmp6SendEcho2 函数 (icmpapi.h)

Icmp6SendEcho2 函数发送 IPv6 ICMPv6 回显请求,并立即返回(如果事件ApcRoutine 为非 NULL),或在指定的超时后返回。ReplyBuffer 包含 IPv6 ICMPv6 回显响应(如果有)。

Syntax

IPHLPAPI_DLL_LINKAGE DWORD Icmp6SendEcho2(
  [in]           HANDLE                 IcmpHandle,
  [in, optional] HANDLE                 Event,
  [in, optional] PIO_APC_ROUTINE        ApcRoutine,
  [in, optional] PVOID                  ApcContext,
  [in]           sockaddr_in6           *SourceAddress,
  [in]           sockaddr_in6           *DestinationAddress,
  [in]           LPVOID                 RequestData,
  [in]           WORD                   RequestSize,
  [in, optional] PIP_OPTION_INFORMATION RequestOptions,
  [out]          LPVOID                 ReplyBuffer,
  [in]           DWORD                  ReplySize,
  [in]           DWORD                  Timeout
);

参数

[in] IcmpHandle

Icmp6CreateFile 返回的打开句柄。

[in, optional] Event

每当 ICMPv6 响应到达时,都会发出信号的事件。 如果指定此参数,则需要有效事件对象的句柄。 使用 CreateEventCreateEventEx 函数创建此事件对象。

有关使用事件的详细信息,请参阅 事件对象

[in, optional] ApcRoutine

调用线程处于可警报线程且 ICMPv6 回复到达时调用的例程。 在 Windows Vista 及更高版本中,必须定义 PIO_APC_ROUTINE_DEFINED 以强制此参数的数据类型 PIO_APC_ROUTINE 而不是 FARPROC

在 Windows Server 2003 和 Windows XP 上,不得定义 PIO_APC_ROUTINE_DEFINED 才能将此参数的数据类型强制为 FARPROC

[in, optional] ApcContext

每当 ICMPv6 响应到达或发生错误时,传递给 ApcRoutine 参数中指定的回调例程的可选参数。

[in] SourceAddress

要对其发出回显请求的 IPv6 源地址,采用 sockaddr 结构的形式。

[in] DestinationAddress

回显请求的 IPv6 目标地址,采用 sockaddr 结构的形式。

[in] RequestData

指向包含在请求中发送数据的缓冲区的指针。

[in] RequestSize

RequestData 参数指向的请求数据缓冲区的大小(以字节为单位)。

[in, optional] RequestOptions

指向请求的 IPv6 标头选项的指针,格式为 IP_OPTION_INFORMATION 结构。 在 64 位平台上,此参数采用 IP_OPTION_INFORMATION32 结构的形式。

如果不需要指定任何 IP 标头选项,此参数可能为 NULL。

注意 在 Windows Server 2003 和 Windows XP 上, RequestOptions 参数不是可选的,不能为 NULL,并且只使用 TtlFlags 成员。
 

[out] ReplyBuffer

指向缓冲区的指针,用于保存对请求的答复。 返回后,缓冲区包含 一个ICMPV6_ECHO_REPLY 结构,后跟 ICMPv6 回显响应回复数据中的消息正文。 缓冲区必须足够大,才能容纳至少一 个ICMPV6_ECHO_REPLY 结构,加上 RequestSize 参数中指定的数据字节数。 此缓冲区还应该足够大,足以容纳 8 个以上的数据字节(ICMP 错误消息的大小)以及 IO_STATUS_BLOCK 结构的空间。

[in] ReplySize

ReplyBuffer 参数指向的回复缓冲区的大小(以字节为单位)。 此缓冲区应足够大,可以容纳至少一 个ICMPV6_ECHO_REPLY 结构加上 RequestSize 字节的数据。 此缓冲区还应该足够大,足以容纳 8 个以上的数据字节(ICMP 错误消息的大小)以及 IO_STATUS_BLOCK 结构的空间。

[in] Timeout

等待答复的时间(以毫秒为单位)。 仅当 以同步方式调用 Icmp6SendEcho2 函数时,才使用此参数。 因此,如果 ApcRoutineEvent 参数不是 NULL,则不使用此参数。

返回值

同步调用时,返回在 ReplyBuffer 中接收和存储的答复数。

异步调用时,通过返回 ERROR_IO_PENDING指示作正在进行中。 可以在以后检索答复数结果、 事件参数信号 中指定的事件或调用 ApcRoutine 参数中的回调函数时。

如果(同步或异步)答复数值为零,则对于扩展错误信息调用 GetLastError

如果函数失败, 则 GetLastError 返回的扩展错误代码可以是以下值之一。

返回代码 Description
ERROR_CALL_NOT_IMPLEMENTED
此系统上不支持此函数。
ERROR_INSUFFICIENT_BUFFER
传递给系统调用的数据区域太小。 如果 ReplySize 参数指示 ReplyBuffer 参数指向的缓冲区太小,则返回此错误。
ERROR_INVALID_PARAMETER
其中一个参数无效。 如果 IcmpHandle 参数包含无效句柄,则返回此错误。
ERROR_IO_PENDING
作正在进行中。 此值由对 Icmp6SendEcho2 的成功异步调用返回,而不是错误指示。
ERROR_NOT_ENOUGH_MEMORY
没有足够的内存可用于处理此命令。
ERROR_NOT_SUPPORTED
不支持该请求。 如果本地计算机上没有 IPv6 堆栈,则返回此错误。
IP_BUF_TOO_SMALL
ReplySize 参数中指定的 ReplyBuffer 的大小太小。
其他
使用 FormatMessage 获取返回错误的消息字符串。

注解

如果 ApcRoutineEvent 参数为 NULL,则以同步方式调用 Icmp6SendEcho2 函数。 以同步方式调用时,返回值包含在等待 Timeout 参数中指定的时间后收到的回复数并将其存储在 ReplyBuffer 中。 如果返回值为零,请调用 GetLastError 以获取扩展错误信息。

指定 ApcRoutine事件参数时,以异步方式调用 Icmp6SendEcho2 函数。 异步调用时,需要 ReplyBufferReplySize 参数才能接受响应。 ICMP 响应数据将复制到提供的 ReplyBuffer ,并发出应用程序信号(指定 事件 参数时)或调用回调函数(指定 ApcRoutine 参数时)。 应用程序必须使用 Icmp6ParseReplies 函数分析 ReplyBuffer 参数指向的数据。

如果指定 了 Event 参数,则以异步方式调用 Icmp6SendEcho2 函数。 每当 ICMPv6 响应到达时, 事件 参数中指定的事件都发出信号。 使用 CreateEvent 函数创建此事件对象。

如果指定 了 ApcRoutine 参数,则以异步方式调用 Icmp6SendEcho2 函数。 ApcRoutine 参数应指向用户定义的回调函数。 每当 ICMPv6 响应到达时, 将调用 ApcRoutine 参数中指定的回调函数。 序列化 ApcRoutine 参数中指定的回调函数的调用。

如果同时指定 了 EventApcRoutine 参数,则每当 ICMPv6 响应到达时, 事件 参数中指定的事件都发出信号,但 忽略 ApcRoutine 参数中指定的回调函数。

在 Windows Vista 及更高版本中,使用 ApcRoutine 参数异步调用 Icmp6SendEcho2 函数的任何应用程序都必须定义PIO_APC_ROUTINE_DEFINED,以强制 ApcRoutine 参数的数据类型PIO_APC_ROUTINE而不是 FARPROC

请注意 在包含 Icmpapi.h 头文件之前,必须定义PIO_APC_ROUTINE_DEFINED。

 

在 Windows Vista 及更高版本上, ApcRoutine 指向的回调函数必须定义为具有以下语法的 VOID 类型的函数:

typedef
VOID WINAPI
(*PIO_APC_ROUTINE) (
    IN PVOID ApcContext,
    IN PIO_STATUS_BLOCK IoStatusBlock,
    IN ULONG Reserved
    );

在 Windows Vista 及更高版本上,传递给回调函数的参数包括:

参数 Description
IN PVOID ApcContext 传递给 Icmp6SendEcho2 函数的 ApcContext 参数。 应用程序可以使用此参数来标识回调函数正在响应的 Icmp6SendEcho2 请求。
IN PIO_STATUS_BLOCK IoStatusBlock 指向 IO_STATUS_BLOCK的指针。 此变量包含最终完成状态和有关作的信息。 回复中实际收到的字节数在IO_STATUS_BLOCK结构的信息成员中返回。

IO_STATUS_BLOCK结构在 Wdm.h 头文件中定义。

在 ULONG 保留 此参数保留。
 

在 Windows Server 2003 和 Windows XP 上,使用 ApcRoutine 参数异步调用 Icmp6SendEcho2 函数的任何应用程序不得定义PIO_APC_ROUTINE_DEFINED以强制 ApcRoutine 参数的数据类型转换为 FARPROC,而不是PIO_APC_ROUTINE

在 Windows Server 2003 和 Windows XP 上, ApcRoutine 指向的回调函数必须定义为具有以下语法的 VOID 类型的函数:

typedef
VOID WINAPI
(*FARPROC) (
    IN PVOID ApcContext,
    );

在 Windows Server 2003 和 Windows XP 上,传递给回调函数的参数包括:

参数 Description
IN PVOID ApcContext 传递给 Icmp6SendEcho2 函数的 ApcContext 参数。 应用程序可以使用此参数来标识回调函数正在响应的 Icmp6SendEcho2 请求。
 

ApcRoutine 参数中指定的回调函数必须与调用 Icmp6SendEcho2 函数的应用程序在同一进程中实现。 如果回调函数位于单独的 DLL 中,则应在调用 Icmp6SendEcho2 函数之前加载 DLL。

对于 IPv4,请使用 IcmpCreateFileIcmpSendEchoIcmpSendEcho2IcmpSendEcho2ExIcmpParseReplies 函数。

请注意, Iphlpapi.h 头文件的 include 指令必须放在 Icmpapi.h 头文件之前。

要求

Requirement 价值
最低支持的客户端 Windows XP [桌面应用 |UWP 应用]
支持的最低服务器 Windows Server 2003 [桌面应用 |UWP 应用]
目标平台 Windows操作系统
Header icmpapi.h
Library Iphlpapi.lib
DLL Iphlpapi.dll

另请参阅

CreateEvent

CreateEventEx

事件对象

GetLastError

ICMPV6_ECHO_REPLY

ICMP_ECHO_REPLY

IP_OPTION_INFORMATION

Icmp6CreateFile

Icmp6ParseReplies

IcmpCloseHandle

IcmpCreateFile

IcmpParseReplies

IcmpSendecho

IcmpSendEcho2

IcmpSendEcho2Ex

sockaddr