icmpSendEcho2Ex 函数 (icmpapi.h)

IcmpSendEcho2Ex 函数发送 IPv4 ICMP 回显请求,如果 EventApcRoutine) 非 NULL,则立即返回 (或在指定的超时后返回。ReplyBuffer 包含 ICMP 响应(如果有)。

语法

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

parameters

[in] IcmpHandle

ICMPCreateFile 函数返回的打开句柄。

[in, optional] Event

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

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

[in, optional] ApcRoutine

当调用线程位于可警报线程中并且 ICMP 回复到达时调用的例程。 必须定义PIO_APC_ROUTINE_DEFINED,以强制此参数的数据类型PIO_APC_ROUTINE而不是 FARPROC

[in, optional] ApcContext

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

[in] SourceAddress

要对其发出回显请求的 IPv4 源地址。 此地址采用 IPAddr 结构的形式。

[in] DestinationAddress

回显请求的 IPv4 目标地址。 此地址采用 IPAddr 结构的形式。

[in] RequestData

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

[in] RequestSize

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

[in, optional] RequestOptions

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

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

[out] ReplyBuffer

指向缓冲区的指针,用于保存对请求的任何答复。 返回时,缓冲区包含 ICMP_ECHO_REPLY 结构数组,后跟选项和数据。 缓冲区必须足够大,以容纳至少一个 ICMP_ECHO_REPLY 结构加上 RequestSize 字节的数据。

此缓冲区还应足够大,以 (ICMP 错误消息的大小再容纳 8 个字节的数据,) 外加 IO_STATUS_BLOCK 结构的空间。

[in] ReplySize

回复缓冲区的分配大小(以字节为单位)。 缓冲区应足够大,以容纳至少一个 ICMP_ECHO_REPLY 结构和 RequestSize 字节的数据。

此缓冲区还应足够大,以 (ICMP 错误消息的大小再容纳 8 个字节的数据,) 外加 IO_STATUS_BLOCK 结构的空间。

[in] Timeout

等待答复的时间(以毫秒为单位)。

返回值

以同步方式调用时, IcmpSendEcho2Ex 函数返回 在 ReplyBuffer 中接收和存储的答复数。 如果返回值为零,请调用 GetLastError 以获取扩展错误信息。

以异步方式调用时, IcmpSendEcho2Ex 函数返回ERROR_IO_PENDING以指示操作正在进行。 稍后,当调用 Event 参数信号中指定的事件或 ApcRoutine 参数中的回调函数时,可以检索结果。

如果返回值为零,请调用 GetLastError 以获取扩展错误信息。

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

返回代码 说明
ERROR_INVALID_PARAMETER
向该函数传递了无效参数。 如果 IcmpHandle 参数包含无效句柄,则返回此错误。 如果 ReplySize 参数指定的值小于 ICMP_ECHO_REPLY 结构的大小,也可能会返回此错误。
ERROR_IO_PENDING
操作正在进行中。 此值由对 IcmpSendEcho2Ex 的成功异步调用返回,并不指示出现错误。
ERROR_NOT_ENOUGH_MEMORY
没有足够的可用内存来完成该操作。
ERROR_NOT_SUPPORTED
不支持该请求。 如果本地计算机上没有 IPv4 堆栈,则返回此错误。
IP_BUF_TOO_SMALL
ReplySize 参数中指定的 ReplyBuffer 的大小太小。
其他
使用 FormatMessage 获取返回错误的消息字符串。

注解

IcmpSendEcho2Ex 函数在 Windows Server 2008 及更高版本上可用。

IcmpSendEcho2Ex 函数是 IcmpSendEcho2 函数的增强版本,允许用户指定要对其发出 ICMP 请求的 IPv4 源地址。 在计算机具有多个网络接口的情况下, IcmpSendEcho2Ex 函数非常有用。

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

指定 ApcRoutineEvent 参数时,将异步调用 IcmpSendEcho2Ex 函数。 异步调用时, 需要 ReplyBufferReplySize 参数才能接受响应。 将 ICMP 响应数据复制到提供的 ReplyBuffer 中,当) 指定 Event 参数或) 指定 ApcRoutine 参数时, (调用回调函数时,应用程序 (发出信号。 应用程序必须使用 IcmpParseReplies 函数分析 ReplyBuffer 参数指向的数据。

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

如果指定 了 ApcRoutine 参数,则异步调用 IcmpSendEcho2Ex 函数。 ApcRoutine 参数应指向用户定义的回调函数。 每当 ICMP 响应到达时, 将调用 ApcRoutine 参数中指定的回调函数。 对 ApcRoutine 参数中指定的回调函数的调用进行序列化。

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

任何使用 ApcRoutine 参数异步调用 IcmpSendEcho2Ex 函数的应用程序都必须定义PIO_APC_ROUTINE_DEFINED,以强制 ApcRoutine 参数的数据类型PIO_APC_ROUTINE而不是 FARPROC

请注意,必须先定义 PIO_APC_ROUTINE_DEFINED ,然后才能包含 Icmpapi.h 头文件。

 

必须使用以下语法将 ApcRoutine 指向的回调函数定义为 VOID 类型的函数:

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

传递给回调函数的参数包括:

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

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

在 ULONG 保留 此参数为保留参数。
 

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

对于 IPv6,请使用 Icmp6CreateFileIcmp6SendEcho2Icmp6ParseReplies 函数。

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

要求

   
最低受支持的客户端 Windows Vista SP1 [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 icmpapi.h
Library Iphlpapi.lib
DLL Iphlpapi.dll

另请参阅

CreateEvent

CreateEventEx

事件对象

GetLastError

ICMPCreateFile

ICMP_ECHO_REPLY

IPAddr

IP_OPTION_INFORMATION

IP_OPTION_INFORMATION32

Icmp6CreateFile

Icmp6ParseReplies

Icmp6Sendecho2

IcmpParseReplies

IcmpSendecho

IcmpSendecho2