Pingip.cpp

#include “stdafx.h”
#include “ping.h”
void CPing::Ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd)
{
SOCKET    rawSocket;
LPHOSTENT lpHost;
UINT      nLoop;
int       nRet;
struct    sockaddr_in saDest;
struct    sockaddr_in saSrc;
DWORD     dwTimeSent;
DWORD     dwElapsed;
u_char    cTTL;
m_hWnd = hWnd;
CString str;
//创建一个Raw套接字
rawSocket = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if (rawSocket == SOCKET_ERROR)
{
CString strMsg;
strMsg.Format(“创建套接字发生错误 – WSAError: %ld”,WSAGetLastError());
//发送报错信息
SendMessage(m_hWnd,WM_MSG_STATUS,0,(LPARAM) AllocBuffer(strMsg));
return;
}
//获得主机信息
lpHost = gethostbyname(pstrHost);
//构造目标套接字地址信息
saDest.sin_addr.s_addr = *((u_long FAR *)(lpHost->h_addr));
saDest.sin_family = AF_INET;
saDest.sin_port = 70;
//ping
for (nLoop = 0; nLoop < nRetries; nLoop++)
{
//发送ICMP回应请求
SendEchoRequest(rawSocket, &saDest);
nRet = WaitForEchoReply(rawSocket);
if (!nRet)
{
str.Format(“Request Timed Out”);
SendMessage(m_hWnd,WM_MSG_STATUS,3,(LPARAM)AllocBuffer(str));
}
else
{
//获得回应
dwTimeSent = RecvEchoReply(rawSocket,&saSrc,&cTTL);
//计算时间
dwElapsed = GetTickCount() – dwTimeSent;
str.Format(“Reply from: %s: bytes=%d time=%ldms TTL=%d”,
inet_ntoa(saSrc.sin_addr),REQ_DATASIZE,dwElapsed,cTTL);
SendMessage(m_hWnd,WM_MSG_STATUS,2,(LPARAM)AllocBuffer(str));
Sleep(1000);
}
}
nRet = closesocket(rawSocket);
if (nRet == SOCKET_ERROR)
{
CString strMsg;
strMsg.Format(“关闭套接字发生错误 – WSAError: %ld”,WSAGetLastError());
//发送报错信息
SendMessage(m_hWnd,WM_MSG_STATUS,0,(LPARAM) AllocBuffer(strMsg));
}
}
//发送ICMPECHO数据包请求
int CPing::SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)
{
static ECHOREQUEST echo;
static nId = 1;
static nSeq = 1;
int nRet;
//构造回应请求
echo.icmpHdr.Type = 8;
echo.icmpHdr.Code = 0;
echo.icmpHdr.Checksum = 0;
echo.icmpHdr.ID = nId++;
echo.icmpHdr.Seq = nSeq++;
for(nRet=0;nRet<REQ_DATASIZE;nRet++)
echo.cData[nRet] = ‘ ‘+nRet;
//保存发送时间
echo.dwTime = GetTickCount();
echo.icmpHdr.Checksum = in_cksum((u_short *)&echo,sizeof(ECHOREQUEST));
//发送请求
nRet = sendto(s,(LPSTR)&echo,sizeof(ECHOREQUEST),0,
(LPSOCKADDR)lpstToAddr,sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR)
{
CString strMsg;
strMsg.Format(“发送数据时发生错误 – WSAError: %ld”,WSAGetLastError());
//发送报错信息
SendMessage(m_hWnd,WM_MSG_STATUS,0,(LPARAM) AllocBuffer(strMsg));
}
return (nRet);
}
//接收ICMPECHO数据包回应
DWORD CPing::RecvEchoReply(SOCKET s,LPSOCKADDR_IN lpsaFrom,u_char *pTTL)
{
ECHOREPLY echoReply;
int nRet;
int nAddrLen = sizeof(struct sockaddr_in);
//接收请求回应
nRet = recvfrom(s,(LPSTR)&echoReply,sizeof(ECHOREPLY),0,
(LPSOCKADDR)lpsaFrom,&nAddrLen);
//检查返回值
if (nRet == SOCKET_ERROR)
{
CString strMsg;
strMsg.Format(“接收数据时发生错误 – WSAError: %ld”,WSAGetLastError());
//发送报错信息
SendMessage(m_hWnd,WM_MSG_STATUS,0,(LPARAM) AllocBuffer(strMsg));
}
//返回发送的时间
*pTTL = echoReply.iphdr.TTL;
return(echoReply.echorequest.dwTime);
}
//等待回应
int CPing::WaitForEchoReply(SOCKET s)
{
struct timeval Time;
fd_set fds;
fds.fd_count = 1;
fds.fd_array[0] = s;
Time.tv_sec = 1;
Time.tv_usec = 0;
return(select(1,&fds,NULL,NULL,&Time));
}
//转换地址
u_short CPing::in_cksum(u_short *addr,int len)
{
register int nleft = len;
register u_short *n = addr;
register u_short answer;
register int sum = 0;
while(nleft > 1)
{
sum += *n++;
nleft -= 2;
}
if(nleft == 1)
{
u_short u = 0;
*(u_char *)(&u) = *(u_char *)n;
sum += u;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return (answer);
}
char* CPing::AllocBuffer(CString strMsg)
{
int nLen = strMsg.GetLength();
char *pBuffer = new char[nLen+1];
strcpy(pBuffer,(const char*)strMsg);
ASSERT(pBuffer != NULL);
return pBuffer;
}

pingip.h

// Ping.h
//
#define REQ_DATASIZE 32 //Echo请求数据的大小
class CPing
{
public:
static char* AllocBuffer(CString strMsg);
HWND m_hWnd; //窗口句柄
void Ping(UINT nRetries,LPCSTR pstrHost,HWND hWnd);
int WaitForEchoReply(SOCKET s);
//ICMP回应的请求和回答函数
int SendEchoRequest(SOCKET, LPSOCKADDR_IN);
DWORD RecvEchoReply(SOCKET, LPSOCKADDR_IN,u_char *pTTL);
u_short in_cksum(u_short *addr, int len);
protected:
};
typedef struct IP_HDR
{
u_char  VIHL;      //Version and IHL
u_char  TOS;       //Type Of Service
short   TotLen;    //总长度
short   ID;    //标识
short   FlagOff;       //标记
u_char  TTL;       //生命期
u_char  Protocol;      //协议
u_short Checksum;      //检查和
struct  in_addr iaSrc; //源地址
struct  in_addr iaDst; //目的地址
}IPHDR, *PIPHDR;
typedef struct IC_MPHDR
{
u_char  Type;     //类型
u_char  Code;     //编码
u_short Checksum; //检查和
u_short ID;   //标识
u_short Seq;      //顺序
char    Data;     //数据
}ICMPHDR, *PICMPHDR;
typedef struct ICMPECHOREQUEST
{
ICMPHDR icmpHdr;
DWORD   dwTime;
char    cData[REQ_DATASIZE];
}ECHOREQUEST, *PECHOREQUEST;
typedef struct ICMPECHOREPLY
{
IPHDR   iphdr;
ECHOREQUEST echorequest;
char    cFiller[256];
}ECHOREPLY, *PECHOREPLY;

转载于:https://www.cnblogs.com/rogee/archive/2011/05/24/2055892.html

VC Ping IP的类相关推荐

  1. ttl一会255一会64_什么ping ip地址返回的ttl值会自己变,一会是255,一会是64 使用ping命令 以前T...

    网络流量大 内网抓下包看看 哪几台机器的流量大 重点排查一下 TTL表示跳数 也就是没经过一个路由器 计数增加1 比如你PING 百度的话 TTL=64 那么从你家的路由器算起 到达腾讯的服务器要经过 ...

  2. java获取真实ip工具类

    场景 有的时候我们需要获取客户端的真实ip,用来实现ip白名单,和黑名单的配置! ip工具类如下 package com.meeno.framework.utils;import javax.serv ...

  3. 第六周项目三-IP地址类

    <pre class="cpp" name="code">/**Copyright(c)2016,烟台大学计算机与控制工程学院*All rights ...

  4. linux ping IP地址与telnet 测试IP端口

    ping命令是不能够测试端口的,ping只是测试网络联接状况以及信息包发送和接收状况. 格式:ping IP地址或主机名 [-t] [-a] [-n count] [-l size] 参数含义:-t不 ...

  5. Java常用工具类---IP工具类、File文件工具类

    package com.jarvis.base.util; import java.io.IOException; import java.io.InputStreamReader; import j ...

  6. php自动配置ip,使用PHP自动PING IP

    使用PHP自动PING IP,校检网络连接是否正常! 国外一位大师使用Sockets Ping,似乎效率更高: PHP代码 <?php // Checksum calculation funct ...

  7. java 代理ip工具类_Java基础之java处理ip的工具类

    java处理ip的工具类,包括把long类型的Ip转为一般Ip类型.把xx.xx.xx.xx类型的转为long类型.根据掩码位获取掩码.根据 ip/掩码位 计算IP段的起始IP.根据 ip/掩码位 计 ...

  8. java filehelper_Java常用工具类---IP工具类、File文件工具类

    package com.jarvis.base.util; import java.io.IOException; import java.io.InputStreamReader; import j ...

  9. linux怎样ping域名看不到ip,在linux下,ping域名ping不了,ping ip却可以解决办法

    ping域名: [root@zyy ~]# ping www.baidu.com ping: unknown host www.baidu.com ping ip时: [root@zyy ~]# pi ...

  10. java linux ping ip,java linux ping命令

    java linux ping命令 [2021-02-03 14:27:06]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&qu ...

最新文章

  1. 5G、物联网、人工智能和机器学习将成为2021年最重要的技术
  2. 涨姿势 |你所不知道的5 个AR增强现实新趋势
  3. iOS子构建Debug运行正常Release运行失败,提示证书问题
  4. 计算机有哪两种绘图,能被计算机接受的数字图像有哪两种?它们分别由什么构成?...
  5. 局部变量、全局变量、堆、堆栈、静态和全局
  6. 海洋大数据关键技术及在灾害天气下船舶行为预测上的应用
  7. 跟随进度而变色进度条效果ios源码
  8. Dicom 医学图像与 nii 标签数据处理
  9. python操作文件open_【转】PYTHON open/文件操作
  10. 互联网应用程序压力测试的那点事
  11. 数据存储与访问之——初见SQLite数据库
  12. Kindle dxg 越狱升级小记
  13. linux读取excel文件内容,如何读取EXCEL文件到内表
  14. 安装 Git 之后系统自动添加自定义快捷命令列表
  15. 第二阶段--团队冲刺--第七天
  16. [转]解析CSS设置默认字体样式
  17. unity3d学习之镜头耀斑
  18. 洛谷P1023 税收与补贴
  19. 论下载需要注册账号和虚拟货币,并所谓的免费下载
  20. 19、商品微服务-srv层实现

热门文章

  1. Flutter音频播放插件just_audio入门指南
  2. 《算法设计》求单峰数组
  3. mysql自定义函数索引_MySQL自定义函数、视图、索引
  4. 不敢相信?System.currentTimeMillis() 居然存在性能问题
  5. 贫穷是我们变得牛逼的动力
  6. python基础篇--变量和简单的数据类型(中)
  7. 接口自动化测试框架搭建(8、发送邮件方法的封装+HTMLTestRunnerCN)--python+HTMLTestRunnerCN+request+unittest+mock+db
  8. 点歌机显示一直弹出连接服务器,点歌机老是显示正在连接云服务器
  9. go-mysql数据-查询--输入数据--实战2
  10. systemctl start named失败的解决方法_有关平安银行的提额方法和提额失败的解决方法...