




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
六、程序代码 文件scanhost.h#pragma pack(4)#pragma comment (lib,”Ws2_32.lib”)#define WIN32_LEAN_AND_MEAN#include #include #include #include #include #include #include /* The IP header */Typedef struct iphdr unsigned int headlen:4; /IP头长度unsigned int version:4; /IP版本号unsigned char tos; /服务类型unsigned short totallen; /IP包总长度unsigned short id; /ID号unsigned short flag; /标记unsigned char ttl; /生存时间unsigned char prot; /协议(UDP TCP)unsigned short checksum; /校验和unsigned int sourceIP; /源IP unsigned int destIP; /目的IPIpHeader;/ICMP headerTypedef struct icmphdr BYTE type; /ICMP类型码,回送请求的类型码为8BYTE code; /子类型码,保存与特定ICMP报文类型相关的细节信息USHORT checksum; /校验和USHORT id; /ICMP报文ID号USHORT seq; /ICMP数据报的序列号IcmpHeader;#define ICMP_ECHO 8 /请求回送#define ICMP_ECHO_REPLY 0 /请求回应#define ICMP_MIN 8 /ICMP包头长度(最小ICMP包长度)#define STATUS_FAILED 0xFFFF /错误码#define DEF_PACKET_SIZE 32 /缺省数据报长度#define MAX_PACKET 1024 /最大数据块长度/最大接收数据包长度#define MAX_PING_PACKET_SIZE(MAX_PACKET+sizeof(IpHeader) void fill_icmp_data(char *,int); /填充ICMP包USHORT checksum(USHORT *,int); /校验和函数void decode_resp(char *,int,struct sockaddr_in *); /找到此数据报IP地址DWORD WINAPI FindIP(LPVOID pIPAddrTemp); /线程调用子函数文件:scanhost.cpp#include “scanhost.h”WSADATA wsaData; /原始套接字SOCKET sockRaw; /dest:搜索目的IP,from:接收ICMP包的源IPStruct sockaddr_in dest,from,end; /end:搜索终止IP,即输入第三个参数 int fromlen = sizeof(from); /接收ICMP包长度char *recvbuf=new charMAX_PING_PACKET_SIZE; /接受ICMP包缓冲区unsigned int addr=0; /IP地址long ThreadNumCounter=0,ThreadNumLimit=20; /线程个数及最大允许线程数long *aa=&ThreadNumCounter;void main(int argc,char *argv)If(argc!=3) /判断输入格式是否正确 cout”输入格式错误: scanhost start_ip end_ip”endl; return;if (WSAStartup(MAKEWORD(2,1),&wsaData) !=0) /开始使用Ws2_32.dll cout”WSAStartup failed:”GetLastError()endl; ExitProcess(STATUS_FAILED);/创建原始套接字sockRaw=WSASocket(AF_INET,SOCK_RSW,IPPROTO_ICMP,NULL,0,wsa_FLAG_OVERLAPPED);if (sockRaw = INVALID_SOCKET) cout”WSASocket() failed: “WSAGetLastError()endl; ExitProcess(STATUS_FAILED);/设置读取延时int timeout = 1000;int bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof (timeout);if(bread = SOCKET_ERROR) cout”failed to set recv timeout: “WSAGetLastError()endl; ExitProcess(STATUS_FAILED);timeout = 1000; bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout);if(bread = SOCKET_ERROR) cout”failed to set send timeout: “WSAGetLastError()endl; ExitProcess(STATUS_FAILED);memset(&dest,0,sizeof(dest); /初始化dest结构unsigned long startIP,endIP;dest.sin_family =AF_INET;dest.sin_addr.s_addr=inet_addr(argv1); /填入开始搜索 IP地址startIP=inet_addr(argv1);end.sin_family=AF_INET;end.sin_addr.s_addr=inet_addr(argv2); /填入结束IP地址endIP=inet_addr(argv2);HANDLE hThread;while(htonl(startupIP)ThreadNumLimit) /线程数目太多? Sleep(5000); /主线程休眠一段时间,不创建新线程 Continue; DWORD ThreadID; sockaddr_in * pIPAddrTemp=new(sockaddr_in); if(!pIPAddrTemp) cout”memory alloc failed”type = ICMP_ECHO; /设置类型信息 icmp_hdr-id = (USHORT)GetCurrentThreadId(); /设置其ID号为当前线程的ID号 datapart = icmp_data + sizeof(IcmpHeader); /计算出ICMP数据报的数据部分memset(datapart,A,datasize sizeof (IcmpHeader); /填入数据void decode_resp(char *buf , int bytes,struct sockaddr_in *from)IpHeader *iphdr;IcmpHeader *icmphdr;unsigned short iphdrlen;iphdr = (IpHeader *)buf;iphdrlen = iphdr-headlen * 4; /IP报头的长度icmphdr=(IcmpHeader *)(buf+iphdrlen); /跳过IP报头/数据包太短,丢弃if(bytestype != ICMP_ECHO_REPLY) return;/ID号不相符,丢弃if(icmphdr-id!=(USHORT)GetCurrentThread() return;/输出正在使用的IP地址cout”活动主机:”sin.addr)1) cksum+=*buffer+; size -=sizeof(USHORT); if(size) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum &.0xffff); cksum += (cksum 16); return (USHORT)(cksum);DWORD WINAPI FindIP(LPVOID pIPAddrTemp) InterlockedIncrement(aa); /线程数目+1 char icmp_dataMAX_PACKET; /MAX_PACKET是数据报最大可能的长度 memset(icmp_data,0,MAX_PACKET); /将数据报清空初始化 int datasize=DEF_PACKET_SIZE; /数据报报文体的缺省长度 datasize+=sizeof(IcmpHeader); /加上报头的长度 fill_icmp_data(icmp_data,datasize); /填充ICMP数据报 (IcmpHeader*)icmp_data)-checksum = 0; /先将校验和置0 (IcmpHeader*)icmp_data)-seq = 0; /序列号为0 /计算校验和为0 (IcmpHeader*)icmp_data)-checksum=checksum(USHORT*)icmp_data,datasize); /发送数据报 int bwrote=sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)pIPAddrTemp,sizeof(dest); int n=0; if (bwrote = SOCKET_ERROR) if (WSAGetLastError() = WSAETIMEDOUT) cout”timed out”endl; cout”sendto failed: “WSAGetLastError()endl; ExitProcess(STATUS_FAILED); n=1; if (WSAGetLastError() = WSAETIMEDOUT) cout”timed out”endl; ExitProcess(STATUS_FAILED); n=1; if (bwrote datasize ) cout”Wrote “bwrote” bytes”endl; ExitProcess(STATUS_FAILED); n=1; /接收数据报 int bread = recvfrom(sockRaw,recvbuf,MAX_PING_PACKET_SIZE,0, ( struct sockaddr*) &from,&fromlen); if (bread = SOCKET_ERROR) if (WS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息技术概念方案
- 我心中的医学人文精神
- 脑转移瘤综合治疗策略
- 浙江省杭州市江南实验学校2026届化学高二上期中联考模拟试题含解析
- 校级交流活动组织与实施框架
- 药品采购知识培训
- 舞蹈课成果汇报
- 药品半年销售总结
- 同济医院心肺康复指南
- 挑战第一天讲解
- 市政工程占道施工方案
- GB/T 39965-2021节能量前评估计算方法
- GB/T 17449-1998包装玻璃容器螺纹瓶口尺寸
- GB/T 12243-2021弹簧直接载荷式安全阀
- GB/T 10066.4-2004电热设备的试验方法第4部分:间接电阻炉
- PMC知识培训课件
- CJJ82-2019-园林绿化工程施工及验收规范
- 个人信息(模板)
- 会计师事务所验资工作底稿模板
- 婚育情况登记表
- (完整版)水电工安全技术交底
评论
0/150
提交评论