IcmpSendEcho2 асинхронный обратный вызов не работает (c ++, vs2010, win7)

Вот тестирование кода, я пытаюсь понять обратные вызовы с IcmpSendEcho2; мой обратный вызов не срабатывает.
Я пытался переместить функции ICMP в другой поток (ссылка на сайт), но не получил результата.
Я попытался использовать стиль обратного вызова XP (здесь я не удивлен, чтобы ничего не получить на win7)

#include <WinSock2.h>  //includes Windows.h
#include <Ws2tcpip.h>

/**
struct from WinDDK Wdm.h (include Wdm.h, Ntddk.h, or Ntifs.h)
*/
typedef struct _IO_STATUS_BLOCK {
union {
NTSTATUS Status;
PVOID    Pointer;
};
ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

/**
typedef for PIO_APC_ROUTINE from MSDN
*/
typedef
VOID
(NTAPI *PIO_APC_ROUTINE) (
IN PVOID ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG Reserved
);
//defined
#define PIO_APC_ROUTINE_DEFINED

#include <iphlpapi.h>
#include <icmpapi.h>
#include <stdio.h>

#include <string>
using namespace std;

#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")

bool    icmpLoop = false;

VOID NTAPI callbackVistaPlus(PVOID ApcContext,PIO_STATUS_BLOCK IoStatusBlock,ULONG Reserved)
{
MessageBoxA(0,"wow!","msg",MB_OK);
}

DWORD WINAPI IcmpThread(PVOID Parameter)
{
unsigned long _serverAddr = inet_addr("192.168.1.2"); //my linux machine
HANDLE _hIcmp = IcmpCreateFile();
bool init = true;
if (_hIcmp == INVALID_HANDLE_VALUE)
{
printf("cant icmpcreatefile\n");
return 0;
}
//for test i create large buffer. it's testing code, not real
char * _replysBuffer = (char*)malloc(sizeof(ICMP_ECHO_REPLY)*1000+8);
if (!_replysBuffer)
{
printf("cant buffer\n");
return 0;
}
char * data = "hi all"; //my testing data to see with tcpdump at linux machine
//  bool loop = true;
DWORD ret = IcmpSendEcho2(
_hIcmp,
0,
callbackVistaPlus,
0,
_serverAddr,
data,
strlen(data),
NULL,
_replysBuffer,
sizeof(ICMP_ECHO_REPLY)*1000+8,
1000);
/**/
printf("ping sended\n");
getchar();
//  while (icmpLoop){Sleep(100);}
printf("exit\n");
IcmpCloseHandle(_hIcmp);
}

int main(int argc, char* argv[])
{
icmpLoop = true;
//  HANDLE hThread = CreateThread(NULL,0,IcmpThread,NULL,0,NULL);
IcmpThread(0);
//  getchar();
//  icmpLoop = false;
getchar();
return 0;
}

Я полностью уверен в правильности существования replyBufferи что IcmpCloseHandle не закрывается до получения ответа (цикл для стиля нити, getchar () «пауза» для нити)

я проверяю tcpdump на машине Linux (которую я использую для отправки эха), и я вижу входящие и исходящие ICMP-пакеты с моими данными — это работает!
Я отлаживаю скомпилированный код и вижу replyBuffer изменения с моими данными после IcmpSendEcho2 ..
Итак … ICMP работает, но не обратный вызов.

Я не хочу переходить на Event-style, потому что это создаст проблемы для моего кода

Также меня удивляет следующая ситуация:
MSDN:

When called asynchronously, the IcmpSendEcho2 function
returns ERROR_IO_PENDING to indicate the operation is in progress.

но IcmpSendEcho2 возвращает 0 и GetLastError() возвращается ERROR_IO_PENDING
Это нормально?

так что, если бы кто-нибудь мог мне помочь — это было бы здорово.

0

Решение

Обратный вызов вызывается только тогда, когда вызывающий поток находится всостояние тревоги».
По сути, вам нужно вызвать одну из расширенных функций ожидания, например, с параметром alerttable flag = true WaitForSingleObjectEx.

0

Другие решения


По вопросам рекламы [email protected]