透析ICMP协议(三): 牛刀初试之一 应用篇ping(ICMP.dll)

转载 2012年10月10日 22:07:05

透析ICMP协议(三): 牛刀初试之一
 应用篇ping(ICMP.dll) 
===============================
这篇文章出自:http://tangentsoft.net/wskfaq/examples/dllping.html
翻译: bugfree/CSDN, 对原始代码加了些注释
平台: VC6 Windows XP

原理简介:
--------
这个例子演示了应用微软的ICMP.DLL怎样"ping"另一台机器. 这个DLL是没有文档话的发送ICMP回送包API接口, 也称为"pings," 就像潜水员对声纳信号的术语一样. 这段代码出自一个被一个名叫MarkG的家伙的GUI程序, 他的网页已经消失了.

ICMP.DLL API 现在在Windows平台上与微软的Winsocks工作的很好, 但是微软说更好的产品一出来他们将替换它. 微软说这个自从Windows 95时代就在用, 这些功能在在Windows 2000上仍然存在.

For more information on the ICMP.DLL API, check out sockets.com's ICMP API page.
更详细的ICMP.DLL API的信息到sockets.com的ICMP API网页获取.


具体实现:
--------
// Borland C++ 5.0: bcc32.cpp ping.cpp
// Visual C++ 5.0:  cl ping.cpp wsock32.lib
//
// This sample program is hereby placed in the public domain.

#include <iostream.h>
#include <winsock.h>
#include <windowsx.h>
#include "icmpdefs.h"

==================ping的实现部分==================
int doit(int argc, char* argv[])
{//[bugfree] 建议将这个argc和argv的处理拿到main函数中
    // 检查命令行参数
    if (argc < 2) {
        cerr << "usage: ping <host>" << endl;
        return 1;
    }
    
    // 装载ICMP.DLL连接库
    HINSTANCE hIcmp = LoadLibrary("ICMP.DLL");
    if (hIcmp == 0) {
        cerr << "Unable to locate ICMP.DLL!" << endl;
        return 2;
    }

    // 查找给定机器的IP地址信息
    struct hostent* phe;
    if ((phe = gethostbyname(argv[1])) == 0) {
        cerr << "Could not find IP address for " << argv[1] << endl;
        return 3;
    }

    // 定义函数三个指针类型
    typedef HANDLE (WINAPI* pfnHV)(VOID);
    typedef BOOL (WINAPI* pfnBH)(HANDLE);
    typedef DWORD (WINAPI* pfnDHDPWPipPDD)(HANDLE, DWORD, LPVOID, WORD,
            PIP_OPTION_INFORMATION, LPVOID, DWORD, DWORD); // evil, no?
    //定义三个指针函数
    pfnHV pIcmpCreateFile;
    pfnBH pIcmpCloseHandle;
    pfnDHDPWPipPDD pIcmpSendEcho;
    
    //从ICMP.DLL中得到函数入口地址
    pIcmpCreateFile = (pfnHV)GetProcAddress(hIcmp,  "IcmpCreateFile");
    pIcmpCloseHandle = (pfnBH)GetProcAddress(hIcmp, "IcmpCloseHandle");
    pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hIcmp, "IcmpSendEcho");
    if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || 
            (pIcmpSendEcho == 0)) {
        cerr << "Failed to get proc addr for function." << endl;
        return 4;
    }

    // 打开ping服务
    HANDLE hIP = pIcmpCreateFile();
    if (hIP == INVALID_HANDLE_VALUE) {
        cerr << "Unable to open ping service." << endl;
        return 5;
    }
   
    // 构造ping数据包
    char acPingBuffer[64];
    memset(acPingBuffer, '

ICMP协议Ping命令的应用

ICMP的全称是 Internet Control Message Protocol ,它是TCP/IP协议族的一个子协议,属于网络层协议,用于在IP主机、路由器之间传递控制消息。从技术角度来讲,就是...
  • WIZnet2012
  • WIZnet2012
  • 2013年07月02日 14:32
  • 3410

Ping及ICMP协议

Ping度娘解释: Ping是Windows、Unix和Linux系统下的一个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助...
  • u012440687
  • u012440687
  • 2016年08月10日 15:47
  • 1258

ICMP协议及ping程序的实现

ICMP协议:  ICMP(Internet Control Message Protocl,网际控制报文协议)是和IP协议同一层次的协议,对Internet以及IP网络的正常运转起着至关重要的作用....
  • jiangqin115
  • jiangqin115
  • 2014年11月13日 17:50
  • 1356

Linux网络编程---ICMP协议分析及ping程序实现

#include #include #include //是Linux系统的日期时间头文件 #include // 是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX...
  • u014634338
  • u014634338
  • 2015年10月10日 19:44
  • 3149

使用 acl 异步库及ICMP协议库编写了一个同时PING多个目标IP的程序

在 acl 的软件包中,lib_acl 是一个基础的库,另外,还有另外一个库 lib_protocol,这个库中不仅包含了 HTTP 协议的实现,而且还有一个 ICMP PING 协议的实现。前些日子...
  • zsxxsz
  • zsxxsz
  • 2014年09月09日 09:51
  • 548

分析ICMP协议数据包格式

了解了ICMP报文由首部和数据段组成。通过wireshark软件的使用加深对此的了解(差错报告、控制报文和请求应答报文)。通过cmd的ping产生icmp数据包。应该多捕捉多一些包,并去了解每个字段的...
  • a1260157543
  • a1260157543
  • 2015年10月17日 17:22
  • 8571

网络中常见的ping命令协议

ICMP是“Internet Control Message Ptotocol”(Internet控制消息协议)的缩写。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制...
  • kerry0071
  • kerry0071
  • 2014年09月17日 12:51
  • 9220

自己动手用ICMP写ping程序

ICMP是(Internet Control Message Protocol)Internet控制报文协议,它传数据,但是对数据有监督功能,比如你的数据没到达,则会返回一个icmp报文。 ic...
  • zhangqi_gsts
  • zhangqi_gsts
  • 2015年12月05日 15:47
  • 1852

ICMP协议之ping实现

1. 相关ICMP协议概述   这里只讲解与ping有关的ICMP消息类型,主机发送回送消息(Type = 8),被请求主机回送响应消息(Type = 0),基本格式如下:   回送消息[ECHO...
  • Beyond_cn
  • Beyond_cn
  • 2015年03月30日 20:52
  • 550

ping 原理与ICMP协议

ping 的原理     ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送icmp回送请求消息...
  • swanabin
  • swanabin
  • 2016年07月27日 18:37
  • 248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:透析ICMP协议(三): 牛刀初试之一 应用篇ping(ICMP.dll)
举报原因:
原因补充:

(最多只允许输入30个字)