91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 10KB
    文件類型: .cpp
    金幣: 1
    下載: 0 次
    發布日期: 2021-05-13
  • 語言: C/C++
  • 標簽: ICMP??主機掃描??

資源簡介

基于ICMP數據包的主機掃描進行網絡管理時,常常需要確定當前網絡中處理活動狀態的主機。本設計的目標就是編制程序,利用ICMP的回送請求和回送應答消息,來發現指定網段中的活動主機,即ping消息的請求和應答。

資源截圖

代碼片段和文件信息

#pragma?pack(4)?
#pragma?comment(lib“ws2_32.lib“)

#include?“windows.h“
#include?“winsock.h“
#include?“stdio.h“
#include?


#define?IP_RECORD_ROUTE 0x7??????//IP記錄路由
#define?ICMP_ECHO 8???????????//ICMP回顯
#define?ICMP_ECHOREPLY 0???????????//ICMP回顯應答???
#define?ICMP_MIN 8???????????????//ICMP數據包最小長度
#define?DEF_PACKET_SIZE? 32??????????//差錯報文長度
#define?MAX_PACKET? 0x10000???????//?ICMP包最大長度
#define?MAX_IP_HDR_SIZE? 60???????????//IP首部最大字節數


//IP頭文件定義
typedef?struct?_iphdr
{
unsigned?int? h_len:4;?//頭部長度?4字節
unsigned?int? version:4;?//IP版本號?IPv4
unsigned?char? tos;?//服務類型
unsigned?short? total_len;?//數據包總長度
unsigned?short? ident;?//ID標識
unsigned?short? frag_and_flags;?//3位標志,13位片偏移?
unsigned?char? ttl;?//生存期
unsigned?char? proto;?//協議類型
unsigned?short? checksum;?//IP頭部的檢驗和
unsigned?int? sourceIP;?//源地址
unsigned?int? destIP;?//目的地址
}?IpHeader;

//ICMP頭部定義
typedef?struct?_icmphdr
{
BYTE? i_type;????//ICMP類型(8位)
BYTE? i_code;???//代碼類型(8位)
USHORT? i_cksum;?//頭部及數據檢驗和(16位)
USHORT? i_id;//ID標識
USHORT? i_seq;?//序列號
ULONG? timestamp;?//時間戳
}?IcmpHeader;

//IP選項首部定義
typedef?struct?_ipoptionhdr
{
unsigned?char?code;?//IP選項的類型
unsigned?char?len;?//RR選項總字節長度
unsigned?char?ptr;?//指針字段
unsigned?long?addr[9];?//?IP地址清單
}?IpOptionHeader;

BOOL?bRecordRoute;
int??datasize;
char?*lpdest;
//定義3個全局變量

//使用信息
void?usage(char?*progname)
{
printf(“usage:?ping?-r?[data?size]\n“);
printf(“?-r?record?route\n“);
printf(“?host?remote?machine?to?ping\n“);
printf(“?datasize?can?be?up?to?0x10000?Byte\n“);
ExitProcess(-1);?//結束進程
}
//ICMP首部初始化
void?FillICMPData(char?*icmp_data?int?datasize)
{
IcmpHeader?*icmp_hdr?=?NULL;
char? *datapart?=?NULL;?//指針定義及初始化
icmp_hdr?=?(IcmpHeader*)icmp_data;
icmp_hdr->i_type?=?ICMP_ECHO;?//ICMP回顯請求
icmp_hdr->i_code?=?0;
icmp_hdr->i_id?=?(USHORT)GetCurrentProcessId();//取得當前進程號
icmp_hdr->i_cksum?=?0;?//檢驗和字段置0
icmp_hdr->i_seq?=?0;???
datapart?=?icmp_data?+?sizeof(IcmpHeader);?//datapart指針指向數據報文開頭
memset(datapart?‘E‘?datasize?-?sizeof(IcmpHeader));?//填充數據段
}

//計算檢驗和
USHORT?checksum(USHORT?*buffer?int?size)
{
unsigned?long?cksum?=?0;??//?檢驗和字段置0
while?(size?>?1)
{
cksum?+=?*buffer++;
size?-=?sizeof(USHORT);
}
if?(size)
{
cksum?+=?*(UCHAR*)buffer;
}
cksum?=?(cksum?>>?16)?+?(cksum?&?0xffff);//將檢驗和字段高16位右移16位再與低16位相加
cksum?+=?(cksum?>>16);//將所加的檢驗和再與剩余低16位相加
return?(USHORT)(~cksum);//檢驗和取反,并返回
}

//解析IP選項
void?DecodeIPOptions(char?*buf?int?bytes)
{
IpOptionHeader?*ipopt?=?NULL;
IN_ADDR?inaddr;????//聲明結構體
int?i;
HOSTENT?*host?=?NULL;
ipopt?=?(IpOptionHeader?*)(buf?+?20);?//去掉IP首部,指針指向數據選項首部
printf(“RR:?“);
for(i?=?0;?i?ptr?/?4)?-?1;?i++)
{
inaddr.S_un.S_addr?=?ipopt->addr[i];
if?(i?!=?0)
{
printf(“?“);
}
host?=?gethostbyaddr((char?*)&inaddr.S_un.S_addr?sizeof(inaddr.S_un.S_addr)?AF_INET);//通過IP地址獲得主機信息
if?(host)
{
printf

評論

共有 條評論

相關資源