1、#define MAX_IP_HDR_SIZE 60 typedef struct iphdr unsigned int h_len:4; /4位首部长度 unsigned int version: /IP版本号,4表示IPV4 unsigned char tos; /8位服务类型TOS unsigned short total_len; /16位总长度(字节) unsigned short ident; /16位标识 unsigned short frag_and_flags; /3位标志位 unsigned char ttl; /8位生存时间 TTL unsigned char proto
2、; /8位协议 (TCP, UDP 或其他) unsigned short checksum; /16位IP首部校验和 unsigned int sourceIP; /32位源IP地址 unsigned int destIP; /32位目的IP地址IpHeader; / 定义ICMP首位 /*/主程序入口*/typedef struct _ihdr BYTE i_type; /8位类型 BYTE i_code; /8位代码 USHORT i_cksum; /16位校验和 USHORT i_id; /识别号(一般用进程号作为识别号) USHORT i_seq; /报文序列号 ULONG time
3、stamp; /时间戳IcmpHeader;#define STATUS_FAILED 0xFFFF #define DEF_PACKET_SIZE 32 /包的大小#define MAX_PACKET 1024 /最大ICMP包长度#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s) #define xfree(p) HeapFree (GetProcessHeap(),0,(p) void fill_icmp_data(char *, int); /填补数据USHORT checksum(USHORT *, i
4、nt); /校验数据void decode_resp(char *,int ,struct sockaddr_in *);void Usage(char *progname) fprintf(stderr, Usage:n ); /传送格式化数据 fprintf(stderr, %s data_sizen ,progname);datasize can be up to 1Kbn ExitProcess(STATUS_FAILED); int main(int argc,char *argv) /初始化套接字WSADATA wsaData; SOCKET sockRaw; struct soc
5、kaddr_in dest,from; struct hostent *hp; int bread,datasize; /定义 bread,datasize int fromlen = sizeof(from); int timeout = 1000; /等待每次回复的超时时间,默认1秒 char *dest_ip; /发送IP地址 char *icmp_data; char *recvbuf; unsigned int addr=0; /初始化地址 USHORT seq_no = 0; /序列号初始化if(WSAStartup(MAKEWORD(2,1),&wsaData) != 0) /初
6、始化函数fprintf(stderr, WSAStartup failed: %dn ,GetLastError(); /设置显示 ExitProcess(STATUS_FAILED); /退出 if(argc h_addr,hp- h_length); elsedest.sin_addr.s_addr = addr; /给目标地址 if(hp)dest.sin_family = hp- h_addrtype; /目标地址赋值dest.sin_family = AF_INET; /目标地址赋值 dest_ip = inet_ntoa(dest.sin_addr); /传送IP地址 if(arg
7、c2) /判断argc是否大于2datasize = atoi(argv2); if(datasize = 0) /判断 datasizedatasize = DEF_PACKET_SIZE; /赋值datasize = DEF_PACKET_SIZE;datasize += sizeof(IcmpHeader);icmp_data =(char *) malloc(MAX_PACKET); /调用最大内存 char型强制转换recvbuf =(char *) malloc(MAX_PACKET);if(!icmp_data) /检查指针是否有效HeapAlloc failed %dn Exi
8、tProcess(STATUS_FAILED); memset(icmp_data,0,MAX_PACKET); fill_icmp_data(icmp_data,datasize); while(1) /ICMP 打包int bwrote; /定义bwrote(IcmpHeader*)icmp_data)- i_cksum = 0; /校验盒 (IcmpHeader*)icmp_data)- timestamp = GetTickCount(); /时间戳 i_seq = seq_no+; /序列号 i_cksum = checksum(USHORT*)icmp_data, datasize); /校验盒bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest, sizeof(dest); / 发送 if(bwrote = SOCKET_ERROR) /判断发送是不是失败了 if (WSAGetLastError() = WSAETIMEDOUT) /判断失败的是不是WSAETIMEDOUTprintf( timed outn /输出 timed outn continue
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1