#include <Winsock2.h>
#include <Iphlpapi.h>
#include <Icmpapi.h>
#include <stdio.h>
#include <windows.h>
bool sendIcmpEcho(TCHAR * dstAddr, //목적지 IP Addr
DWORD tmOut, //요청 타임아웃
LPVOID pData, //데이터
DWORD dataSize, //데이터 사이즈
ULONG * status) //응답 상태코드
{
HANDLE hIcmpFile = null;
DWORD dwRetVal = 0;
LPVOID ReplyBuffer = null;
bool bRet = false;
if((hIcmpFile = IcmpCreateFile()) == INVALID_HANDLE_VALUE)
return bRet;
ReplyBuffer = (VOID*) new byte[sizeof(ICMP_ECHO_REPLY) + dataSize];
if((dwRetVal = IcmpSendEcho(hIcmpFile, inet_addr(dstAddr), pData, dataSize,
NULL, ReplyBuffer, dataSize + sizeof(ICMP_ECHO_REPLY), tmOut)) != 0)
{
/*
ICMP_ECHO_REPLY * p = (ICMP_ECHO_REPLY *)ReplyBuffer;
printf("st Address %d\n",p->Address);
printf("st Status %d\n",p->Status);
printf("st RoundTripTime %d\n",p->RoundTripTime);
printf("st DataSize %d\n",p->DataSize);
printf("st Reserved %d\n",p->Reserved);
printf("st Data %s\n",p->Data);
*/
bRet = !bRet;
*status = ((ICMP_ECHO_REPLY *)ReplyBuffer)->Status;
}
delete[] ReplyBuffer;
CloseHandle(hIcmpFile);
return bRet;
}
Link to iphlpapi.lib, ws2_32.lib
별로 세밀한 제어?를 할 수는 없지만 .. ICMP Echo를 이용해 특별한 일을 할 일은 없을 듯 하여, 이 정도로도 충분히 사용가능 할듯하다. IcmpSendEcho2()를 이용하면 이벤트를 이용해
비동기 처리도 가능하다.