博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
透析ICMP协议(四): 牛刀初试之二 应用篇ping(RAW Socket)
阅读量:4156 次
发布时间:2019-05-26

本文共 2960 字,大约阅读时间需要 9 分钟。

透析ICMP协议(四): 牛刀初试之二

 应用篇ping(RAW Socket)
===============================
这篇文章出自bugfree/CSDN
平台: VC6 Windows XP

今晚一杯茶水之后, 让我们继续我们的ICMP讨论, 今晚介绍的是用RAW Socket 实现的ping程序.

原理简介:

-------- 
 用RAW Socket实现的ping可能比上一节的应用ICMP.DLL的程序庞大些, 但是这才是我们需要关注的东西, 我的观点真正想做网络开发的程序员应该静下心来读读这篇文章, 相信你会从中获益颇多. 中间我也会讲解一些东西为后一章的路由追踪做一些铺垫. 
 另一个重要的要讲的东西, 微软宣布随时不支持上节讲的ping用到的开发接口, 但是本节的讲的是更一般的东西. 所以它不会过时, 甚至做很小的改动就可以移植到别的系统上去. 系统移植不是我们的讲的重点. 但是微软的长期支持足以引起我们充分的重视.
 如何少作变动来使的这个程序实现追踪路由的功能, 这里只是抛砖引玉. 将ICMP包中IP包的包头该为特定的值就能得到那个路由器的IP(要求到达目的地的跳数大于你设的特定值).
 这个程序需要windows2k/WindowsXP/WindowsNT平台和系统管理员的权限.

具体实现:

--------
这段源代码大部分来自:
   
[bugfree]只做了少量修改,给出了大量的注释, 最后结合经验给出了自己的建议.

----------

/*

 * 程序名: rawping_driver.cpp
 * 说明:    
 *       驱动程序,也是主函数
 */
#include <winsock2.h>  
#include <iostream.h>

#include "rawping.h"

#define DEFAULT_PACKET_SIZE 32   // 默认ICMP包字节数

#define DEFAULT_TTL 30           // 默认TTL值
#define MAX_PING_DATA_SIZE 1024  // 最大数据块 
#define MAX_PING_PACKET_SIZE (MAX_PING_DATA_SIZE + sizeof(IPHeader)) //最大ICMP包长度

/* 为 send_buf 和 recv_buf 分配内存

 * send_buf大小为 packet_size
 * recv_buf大小为 MAX_PING_PACKET_SIZE, 保证大于send_buf
 */
int allocate_buffers(ICMPHeader*& send_buf, IPHeader*& recv_buf,
        int packet_size);

///
// Program entry point

int main(int argc, char* argv[])

{
        
    int seq_no = 0;   //用在发送和接受的ICMP包头中
    ICMPHeader* send_buf = 0; 
    IPHeader* recv_buf = 0;

    // 判断命令行是否合法

    if (argc < 2) {
        cerr << "usage: " << argv[0] << " <host> [data_size] [ttl]" <<
                endl;
        cerr << " data_size can be up to " << MAX_PING_DATA_SIZE <<
                " bytes.  Default is " << DEFAULT_PACKET_SIZE << "." << 
                endl; 
        cerr << " ttl should be 255 or lower.  Default is " <<
                DEFAULT_TTL << "." << endl;
        return 1;
    }

    // 处理命令行参数

    int packet_size = DEFAULT_PACKET_SIZE;
    int ttl = DEFAULT_TTL;
    if (argc > 2) {
        int temp = atoi(argv[2]);
        if (temp != 0) {
            packet_size = temp;
        }
        if (argc > 3) {
            temp = atoi(argv[3]);
            if ((temp >= 0) && (temp <= 255)) {
                ttl = temp;
            }
        }
    }
    packet_size = max(sizeof(ICMPHeader), 
            min(MAX_PING_DATA_SIZE, (unsigned int)packet_size));

    // 启动 Winsock

    WSAData wsaData;
    if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0) {
        cerr << "Failed to find Winsock 2.1 or better." << endl;
        return 1;
    }

    SOCKET sd; // RAW Socket句柄

    sockaddr_in dest, source; 
    
    // 三个任务(创建sd, 设置ttl, 初试dest的值)
    if (setup_for_ping(argv[1], ttl, sd, dest) < 0) {
        goto cleanup; //释放资源并退出
    }
    // 为send_buf和recv_buf分配内存 
    if (allocate_buffers(send_buf, recv_buf, packet_size) < 0) {
        goto cleanup;
    }
    // 初试化IMCP数据包(type=8,code=0)
    init_ping_packet(send_buf, packet_size, seq_no);

    // 发送ICMP数据包

    if (send_ping(sd, dest, send_buf, packet_size) >= 0) {
        while (1) {
            // 接受回应包
            if (recv_ping(sd, source, recv_buf, MAX_PING_PACKET_SIZE) <
                    0) {
                // Pull the sequence number out of the ICMP header.  If 
                // it's bad, we just complain, but otherwise we take 
                // off, because the read failed for some reason.
                unsigned short header_len = recv_buf->h_len * 4;
                ICMPHeader* icmphdr = (ICMPHeader*)
                        ((char*)recv_buf + header_len);
                if (icmphdr->seq != seq_no) {
                    cerr << "bad sequence number!" << endl;
                    continue;
                }
                else {
                 &nb

转载地址:http://plfxi.baihongyu.com/

你可能感兴趣的文章
Learning by tracking:Siamese CNN for robust target association
查看>>
MUSTer:Multi-Store Tracker:A Cognitive Psychology Inspired Approach to Object Tracking
查看>>
Understanding and Diagnosing Visual Tracking Systems
查看>>
Multiple People Tracking by Lifted Multicut and Person Re-identification
查看>>
Visual Tracking Using Attention-Modulated Disintegration and Integration
查看>>
Action-Decision Networks for Visual Tracking with Deep Reinforcement Learning
查看>>
Multiple Object Tracking with High Performance Detection and Appearance Feature
查看>>
深度学习入门(上)-第一章 必备基础知识点
查看>>
ubuntu unzip解压时提示错误 解决方法
查看>>
sprintf函数的说明
查看>>
BOOST_TYPEOF和BOOST_AUTO 作用
查看>>
随机森林概述
查看>>
2011十大战略技术
查看>>
大学应该学的软件知识
查看>>
腾讯与360战争背后的云计算阴影
查看>>
腾讯看了会沉默,360看了会流泪
查看>>
李开复:移动互联网机会最大 微博会现最大赢家
查看>>
2006年的IT十大战略技术
查看>>
操作系统介绍
查看>>
Desktop Linux: The Dream Is Dead
查看>>