|
原理简介: -------- 用RAW Socket实现的ping可能比上一节的应用ICMP.DLL的程序庞大些, 但是这才是我们需要关注的东西, 我的观点真正想做网络开发的程序员应该静下心来读读这篇文章, 相信你会从中获益颇多. 中间我也会讲解一些东西为后一章的路由追踪做一些铺垫. 另一个重要的要讲的东西, 微软宣布随时不支持上节讲的ping用到的开发接口, 但是本节的讲的是更一般的东西. 所以它不会过时, 甚至做很小的改动就可以移植到别的系统上去. 系统移植不是我们的讲的重点. 但是微软的长期支持足以引起我们充分的重视. 如何少作变动来使的这个程序实现追踪路由的功能, 这里只是抛砖引玉. 将ICMP包中IP包的包头该为特定的值就能得到那个路由器的IP(要求到达目的地的跳数大于你设的特定值). 这个程序需要windows2k/WindowsXP/WindowsNT平台和系统管理员的权限.
具体实现: -------- 这段源代码大部分来自: http://tangentsoft.net/wskfaq/examples/rawping.html [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 << "\tdata_size can be up to " << MAX_PING_DATA_SIZE << " bytes. Default is " << DEFAULT_PACKET_SIZE << "." << endl; cerr << "\tttl should be 255 or lower. Default is " <<
上一篇:全面分享:网络协议标准规范大全一
下一篇:透析ICMP协议(三): 应用篇ping(ICMP.dll)
|