返回> 网站首页 

基于MFC的ping命令的代码实现

yoours2011-02-10 10:35:06 阅读 1139

简介一边听听音乐,一边写写文章。

BOOL IsActive(char *ip)
{
struct in_addr iaDest; // Internet地址结构体
LPHOSTENT pHost; // 主机入口结构体指针
DWORD *dwAddress; // IP地址

WSAData wsaData;
BOOL bRet;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
{
return FALSE;
}

// 检查WinSock的版本
if (0x0202 != wsaData.wVersion)
{
//No WinSock version 2.2 support found
WSACleanup();
return false;
}

//使用inet_addr()以判定ping目标为地址还是名称
iaDest.s_addr = inet_addr(ip);
if (iaDest.s_addr == INADDR_NONE)
pHost = gethostbyname(ip);
else
pHost = gethostbyaddr((const char*) &iaDest, sizeof(struct in_addr),AF_INET);

if (pHost == NULL)
{
return FALSE;
}

// 拷贝IP地址
dwAddress = (DWORD*)(*pHost->h_addr_list);
HINSTANCE hIcmp=LoadLibrary("ICMP.dll");
if(hIcmp==0)
{
return FALSE;
}

typedef HANDLE (WINAPI* pfnHV)(VOID);
typedef BOOL (WINAPI* pfnBH)(HANDLE);
typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD,PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD);

pfnHV pIcmpCreateFile;
pfnBH pIcmpCloseHandle;
pfnDHDPWPipPDD pIcmpSendEcho;

pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp, "IcmpCreateFile");
pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp, "IcmpCloseHandle");
pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp, "IcmpSendEcho");
if(pIcmpCreateFile==NULL)
{
return FALSE;
}

if(pIcmpCloseHandle==NULL)
{
return FALSE;
}

if(pIcmpSendEcho==NULL)
{
return FALSE;
}

HANDLE hIP=pIcmpCreateFile();
if(hIP==INVALID_HANDLE_VALUE)
{
return FALSE;
}

char acPingBuffer[64];
memset(acPingBuffer, 0, 64);
memset(acPingBuffer, '\xAA', sizeof(acPingBuffer));
PICMP_ECHO_REPLY pIpe = (PICMP_ECHO_REPLY)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, sizeof(ICMP_ECHO_REPLY) + sizeof(acPingBuffer)); 
if(pIpe==0)
{
return FALSE;
}

pIpe->Data = acPingBuffer;
pIpe->DataSize = sizeof(acPingBuffer);

DWORD dwStatus = pIcmpSendEcho(hIP, *dwAddress, acPingBuffer, sizeof(acPingBuffer), NULL, pIpe, sizeof(ICMP_ECHO_REPLY) + sizeof(acPingBuffer), 1000);
if(dwStatus!=0)
{
bRet=TRUE;
}else{
bRet=FALSE;
}

//TRACE("Addr: %d.%d.%d.%d\r\n", int(LOBYTE(LOWORD(pIpe->Address))),int(HIBYTE(LOWORD(pIpe->Address))), int(LOBYTE(HIWORD(pIpe->Address))), int(HIBYTE(HIWORD(pIpe->Address))));
//TRACE("RTT: %dms, TTL:%d\r\n", int(pIpe->RoundTripTime), int(pIpe->Options.Ttl));

GlobalFree(pIpe);
FreeLibrary(hIcmp);
WSACleanup();
return bRet;
}


bool bret1 = IsActive("baidu.com");
bool bret2 = IsActive("192.168.0.72");
TRACE("1. %s\r\n2. %s\r\n",(bret1?"true":"false"), (bret2?"true":"false"));

微信小程序扫码登陆

文章评论

1139人参与,0条评论