#include "StdAfx.h"
#include "STPing.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//构造函数
STPing::STPing(void)
{
hIcmp = LoadLibrary(_T("icmp.dll"));
if(NULL != hIcmp)
{
pIcmpCreateFile = (PIcmpCreateFile)GetProcAddress(hIcmp, "IcmpCreateFile");
pIcmpSendEcho = (PIcmpSendEcho)GetProcAddress(hIcmp, "IcmpSendEcho");
pIcmpCloseHandle = (PIcmpCloseHandle)GetProcAddress(hIcmp, "IcmpCloseHandle");
}
}
//析构函数
STPing::~STPing(void)
{
FreeLibrary(hIcmp);
}
//功能:ping某个地址或者Ip,返回结果
//参数:v_pszDesAddress-目标域名或者IP
//参数:v_usTimes-需要ping的次数
//参数:v_ulTimeout-超时时间,单位毫秒
//返回值:-1-发生异常,其他大于等于0的值表示未超时的次数
int STPing::Ping(const char *v_pszDesAdress, USHORT v_usTimes, ULONG v_ulTimeout)
{
ULONG ulDesIP = 0;
int ret = 0;
// 当传递的参数为域名时,解析该域名的IP
ulDesIP = inet_addr(v_pszDesAdress);
//域名
if(ulDesIP == INADDR_NONE)
{
// 解析传入域名的IP
PHOSTENT pHostent = gethostbyname(v_pszDesAdress);
if (pHostent == NULL)
{
return -1;
}
ulDesIP = *(DWORD *)pHostent->h_addr;
}
// 申请发送缓冲区
void *sendBuffer = new char[32];
if (sendBuffer == NULL)
{
return -1;
}
// 申请接收缓冲区
unsigned long replySize = sizeof(ICMP_ECHO_REPLY) + 32;
void *replyBuffer = new char[replySize];
if (replyBuffer == NULL)
{
delete [] sendBuffer;
sendBuffer = NULL;
return -1;
}
PICMP_ECHO_REPLY pIcmpEchoReply = (PICMP_ECHO_REPLY)replyBuffer;
// 获取ICMP echo所需句柄
HANDLE hIcmpFile = pIcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE)
{
delete [] sendBuffer;
sendBuffer = NULL;
delete [] replyBuffer;
replyBuffer = NULL;
return -1;
}
// 调用IcmpSendEcho,获取Ping值
for (int i=0; i<v_usTimes; i++)
{
DWORD returnval = pIcmpSendEcho(hIcmpFile, ulDesIP, sendBuffer, 32, NULL, replyBuffer, replySize, v_usTimes);
if (pIcmpEchoReply->Status == 0) // 未超时
{
ret++;
//TRACE("<STPing::Ping>camera ip---%s,ping-ret---%d\n",v_pszDesAdress,ret);
}else
{
//TRACE("<STPing::Ping>camera ip---%s,ping-ret---%d\n",v_pszDesAdress,pIcmpEchoReply->Status);
}
}
//释放缓冲区,关闭句柄
delete[] replyBuffer;
replyBuffer=NULL;
delete[] sendBuffer;
sendBuffer=NULL;
pIcmpCloseHandle(hIcmpFile);
return ret;
}
int STPing::Ping( ULONG v_ulDesAdress, USHORT v_usTimes, ULONG v_ulTimeout )
{
ULONG ulDesIP = v_ulDesAdress;
int ret = 0;
// 申请发送缓冲区
void *sendBuffer = new char[32];
if (sendBuffer == NULL)
{
return -1;
}
// 申请接收缓冲区
unsigned long replySize = sizeof(ICMP_ECHO_REPLY) + 32;
void *replyBuffer = new char[replySize];
if (replyBuffer == NULL)
{
delete [] sendBuffer;
sendBuffer = NULL;
return -1;
}
PICMP_ECHO_REPLY pIcmpEchoReply = (PICMP_ECHO_REPLY)replyBuffer;
// 获取ICMP echo所需句柄
HANDLE hIcmpFile = pIcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE)
{
delete [] sendBuffer;
sendBuffer = NULL;
delete [] replyBuffer;
replyBuffer = NULL;
return -1;
}
// 调用IcmpSendEcho,获取Ping值
for (int i=0; i<v_usTimes; i++)
{
DWORD returnval = pIcmpSendEcho(hIcmpFile, ulDesIP, sendBuffer, 32, NULL, replyBuffer, replySize, v_usTimes);
if (pIcmpEchoReply->Status == 0) // 未超时
{
ret++;
}
}
//释放缓冲区,关闭句柄
delete[] replyBuffer;
replyBuffer=NULL;
delete[] sendBuffer;
sendBuffer=NULL;
pIcmpCloseHandle(hIcmpFile);
return ret;
}
C++ ping 源码
需积分: 27 154 浏览量
2018-08-03
06:01:06
上传
评论 1
收藏 2KB ZIP 举报
wxh_xdk
- 粉丝: 16
- 资源: 23