0

我需要使用 ApcRoutine 回调例程异步使用 IcmpSendEcho2 API 命令。

我的一个问题是我需要定义的 ApcRoutine 回调例程的签名是什么样的?

当我调用 IcmpSendEcho2 时,第三个参数会是什么样子?

我有大约 15 个代理请求要发送。我应该只向 IcmpSendEcho2 请求一次还是多次。

如果我需要一次发送许多 IcmpSendEcho2 请求。回调 ApcRoutine 将如何知道完成了哪个 IcmpSendEcho2 调用。我猜这就是 ApcContext 参数发挥作用的地方?

我在 MSDN 或其他地方找不到任何演示如何异步使用 IcmpSendEcho2 命令的示例代码。

4

1 回答 1

2
int ReplyCame(PVOID param)
{
 char* szAddr = (char*) param;

 printf("Replay Came for %s......\n", szAddr);

 return 0;
}

char* szAddr1 = "172.18.1.1";
char* szAddr2 = "172.18.1.4";

int _tmain(int argc, _TCHAR* argv[])
{
 char *SendData = "Data Buffer";
 LPVOID ReplyBuffer;

 HANDLE IcmpHandle = IcmpCreateFile();

 IPAddr addr1 = inet_addr(szAddr1);
 IPAddr addr2 = inet_addr(szAddr2);

 ReplyBuffer = (VOID*) malloc(sizeof(ICMP_ECHO_REPLY) + sizeof(SendData));

 IcmpSendEcho2(IcmpHandle, NULL, (FARPROC)ReplyCame, szAddr1, addr1, 
SendData, sizeof(SendData), NULL, ReplyBuffer, 8*sizeof(ReplyBuffer) + 
sizeof(ICMP_ECHO_REPLY), 1000);
 IcmpSendEcho2(IcmpHandle, NULL, (FARPROC)ReplyCame, szAddr2, addr2, 
SendData, sizeof(SendData), NULL, ReplyBuffer, 8*sizeof(ReplyBuffer) + 
sizeof(ICMP_ECHO_REPLY), 1000);

 SleepEx(5000, TRUE);

 return 0;
}

请注意,如果您想使用replyBuffer,您需要先使用IcmpParseReplies 对其进行解析。

于 2013-10-02T20:04:25.647 回答