`

[转]C++验证IP是否可以PING通

 
阅读更多
https://www.cnblogs.com/guoyz1314/p/3527340.html

#include <Winsock2.h>
#include "iphlpapi.h" 
   
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"Ws2_32.lib")
typedef HANDLE (WINAPI* ICMPCREATEFILE)(VOID);   
typedef BOOL (WINAPI* ICMPCLOSEHANDLE)(HANDLE);   
typedef DWORD (WINAPI* ICMPSENDECHO)(HANDLE, DWORD, LPVOID, WORD,PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD);    
                       
//定义三个指针函数   
ICMPCREATEFILE pIcmpCreateFile;   
ICMPCLOSEHANDLE pIcmpCloseHandle;   
ICMPSENDECHO pIcmpSendEcho; 
// 函数功能:初始化ICMP函数:
BOOL InitIcmp()   
{   
    HINSTANCE hIcmp = LoadLibrary("ICMP.DLL");   
    if(hIcmp==NULL)
  {   
        return false; 
  }  
    pIcmpCreateFile = (ICMPCREATEFILE)GetProcAddress(hIcmp,"IcmpCreateFile");   
    pIcmpCloseHandle = (ICMPCLOSEHANDLE)GetProcAddress(hIcmp,"IcmpCloseHandle");   
    pIcmpSendEcho = (ICMPSENDECHO)GetProcAddress(hIcmp,"IcmpSendEcho");   
    if ((pIcmpCreateFile == NULL)||(pIcmpCloseHandle == NULL)||(pIcmpSendEcho == NULL))   
        return false;   
    return true;   
}

// 函数功能:判断是否能ping通IP
// 函数参数:IP地址或域名
BOOL ICMPPing(char* host) 
{   
    DWORD timeOut=1000;                                              //设置超时   
    ULONG hAddr=inet_addr(host);                                     //如果是IP地址就直接转换   
    if(hAddr==INADDR_NONE)   
    {   
        hostent* hp=gethostbyname(host);                             //如果是域名就用DNS解析出IP地址   
        if(hp)   
            memcpy(&hAddr,hp->h_addr_list,hp->h_length);             //IP地址   
        else
        {   
            return false;   
        }   
    }   
    HANDLE hIp=pIcmpCreateFile();   
    IP_OPTION_INFORMATION ipoi;   
    memset(&ipoi,0,sizeof(IP_OPTION_INFORMATION));   
    ipoi.Ttl =128;                  //Time-To-Live   
                    
    unsigned char pSend[36];                                                                   //发送包   
    memset(pSend,'E',32);   
                    
    int repSize=sizeof(ICMP_ECHO_REPLY)+32;   
    unsigned char pReply[100];                                                                 //接收包   
    ICMP_ECHO_REPLY* pEchoReply=(ICMP_ECHO_REPLY*)pReply;   
                    
    DWORD nPackets=pIcmpSendEcho(hIp,hAddr,pSend,32,&ipoi,pReply,repSize,timeOut);             //发送ICMP数据报文   
                    
    if(pEchoReply->Status!=0)                                                                  //超时,可能是主机禁用了ICMP 或者目标主机不存在  
    {   
        pIcmpCloseHandle(hIp);   
        return false;   
    }   
                    
    pIcmpCloseHandle(hIp);   
    return true;   
}
int main()
{
 InitIcmp();
 ICMPPing("192.168.0.1");
 return 0;
}
分享到:
评论

相关推荐

    用C/C++代码检测ip能否ping通(配合awk和system可以做到批量检测)

    首先,让我们看一段简单的C++代码,它使用了`system`函数和`ping`命令来检测单个IP地址是否可以ping通。代码的核心在于`getCmdResult`函数,该函数接收一个命令字符串,通过`popen`和`pclose`调用来执行命令并获取其...

    C++实现ping命令的功能(Windows)

    在Windows操作系统中,`ping`命令是一个非常基础且重要的网络诊断工具,用于检查网络连接是否通畅,通过发送ICMP(Internet Control Message Protocol)回显请求数据包到目标主机并接收回应来验证网络可达性。...

    编写Ping程序(C++)

    在编写一个用C++编写的Ping程序时,我们需要涉及到多个编程和网络通信的知识点,主要包括Winsock编程模型、ICMP协议、原始套接字(Raw Sockets)的使用,以及网络编程的一些基本概念。 首先,Winsock(Windows ...

    C++编写的连续批量的PIng测试

    Ping测试不仅可以用来验证两台设备之间的网络连通性,还可以测量数据包的往返时间(RTT,Round-Trip Time),从而评估网络延迟。这对于网络故障排查、性能优化、远程服务访问、以及分布式系统中的节点间通信质量监控...

    用 C++实现基于window终端的ping命令

    在本文中,我们将深入探讨如何使用C++编程语言在Windows环境下实现一个基本的ping命令功能。这个过程涉及网络编程、套接字编程以及系统调用等核心概念。首先,我们需要理解ping命令的基本工作原理,它是通过发送ICMP...

    ping命令在windows下的c++实现

    "ping命令在windows下的c++实现" 这个标题表明我们要讨论的是如何使用C++编程语言在Windows操作系统环境下实现一个类似于系统自带的`ping`命令的程序。`ping`命令通常用于测试网络连接的可达性和速度,通过发送ICMP...

    ping命令的c++/c程序实现

    标题中的“ping命令的C++/C程序实现”是指利用C++或C语言编写一个功能类似于操作系统内置的ping命令的程序。ping命令是网络诊断工具,用于检查网络连接的连通性,通过发送ICMP(Internet Control Message Protocol)...

    ping命令的C++代码

    在C++中实现`ping`功能,我们需要使用套接字编程,尤其是RAW Socket,因为它允许我们直接操作IP和ICMP数据包。以下是一些关键步骤: 1. **创建RAW Socket**:使用`socket()`函数创建一个原始套接字,指定协议族为`...

    PING C++Programming

    这个程序是在Visual Studio 2010集成开发环境中编写的,使用者可以方便地加载并运行它,以了解或学习如何在C++中实现网络通信中的“ping”操作。在C++中实现ping功能可以帮助开发者理解网络I/O、套接字编程以及...

    群ping工具

    在项目实施过程中,特别是在网络部署或服务器集群的配置阶段,常常需要验证新IP地址是否可以正常通信。传统的ping命令只能针对单个IP地址进行测试,而群ping工具则大大提高了效率,一次性可以处理多个IP地址,节省了...

    实现窗体Ping命令

    - **诊断网络问题**:当无法访问特定网站或服务时,可以先尝试Ping该服务器,如果无法Ping通,可能是网络连接问题,或者目标服务器关闭了ICMP回应。 - **测量网络延迟**:通过观察返回的时间戳,可以了解数据包从...

    ping vc测试程序

    在计算机网络中,"ping"命令是一个基本的通信协议测试工具,通过发送Internet控制消息协议(ICMP)回显请求报文来验证两台设备之间的网络连接是否通畅。这个测试程序对ping命令进行了封装,提供了更方便、定制化的使用...

    MFC ping程序 可运行

    Ping是一个网络诊断工具,用于测试两台计算机之间的网络连接性,通过发送Internet控制消息协议(ICMP)回显请求来验证目标主机是否可达。 描述中提到“win7不可运行”,意味着这个特定的MFC ping程序可能在Windows ...

    微软PingC源代码

    例如,当你在命令行输入`ping`命令时,计算机就会发送ICMP回显请求到目标主机,然后目标主机回应一个回显应答,这样就可以检查网络连接是否正常。在源代码中,你可能会看到如何构造ICMP报文、设置报文头的字段、处理...

    ping 课程设计

    "ping"命令是网络诊断工具中的基础之一,用于测试网络连通性,验证两台设备之间的网络通信。在这个“ping课程设计”项目中,我们利用Microsoft Foundation Classes (MFC)库构建了一个图形用户界面(GUI),使用户...

    PING.rar_ping

    通过发送Internet控制消息协议(ICMP)回显请求数据包到目标主机并接收回显应答,ping工具可以检查两台计算机之间的网络连接是否通畅,以及大致了解网络延迟情况。 描述中提到,这个ping程序是“简单的”,意味着它...

    smokeping说明文档.docx

    初始化过程包括创建文件夹、复制配置文件、修改配置文件以适应具体需求,设置绘图支持中文显示,验证权限,并将烟雾ping配置为自启动服务。同时,可能需要调整Apache配置文件,以便正确地服务烟雾ping的Web页面。 *...

    ping探测目标主机是否存活

    标题中的“ping探测目标主机是否存活”涉及到网络通信的基本概念,即使用ping命令来检查网络上的另一台设备是否可以响应。Ping是Internet控制消息协议(ICMP)的一部分,用于网络诊断。通过发送ICMP回显请求数据包到...

    大面积ping交换机 多线程的小工具

    MFC是C++的一个类库,用于开发Windows应用程序,它封装了许多Windows API,使得开发者可以更容易地利用多线程特性。通过MFC,程序员可以创建线程对象,管理线程的生命周期,并在多个线程之间同步数据,避免竞态条件...

    基于icmp协议的PING程序,win32平台,vc++6.0

    描述中提到,“icmp协议的ping程序设计,基于win32平台利用vc++6.0编写,具有一定的实用性”,意味着这个程序可以用来验证两台计算机之间的网络连通性,检查网络延迟,以及检测可能存在的网络问题。VC++6.0是...

Global site tag (gtag.js) - Google Analytics