www.pudn.com > MoveHost.rar > scanhost.cpp


#pragma pack(4) 
#include "stdafx.h" 
#pragma comment (lib,"Ws2_32.lib") 
#define WIN32_LEAN_AND_MEAN 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
 
typedef struct iphdr 
{ 
	unsigned int headlen:4; 
	unsigned int version:4; 
	unsigned char tos; 
	unsigned short totallen; 
	unsigned short id; 
	unsigned short falg; 
	unsigned char ttl; 
	unsigned char prot; 
	unsigned short checksum; 
 
	unsigned int sourceIP; 
	unsigned int destIP; 
 
}IpHeader; 
 
typedef struct icmphdr 
{ 
	BYTE type; 
	BYTE code; 
	USHORT checksum; 
	USHORT id; 
	USHORT seg; 
 
}IcmpHeader; 
 
#define ICMP_RCHO 8 
#define ICMP_RCHO_REPLY 0 
#define	ICMP_MIN 8 
#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); 
USHORT checksum(USHORT *,int); 
void decode_resp(char *,int,struct sockaddr_in *); 
 
DWORD WINAPI FindIP(LPVOID pIPAddrTemp); 
 
WSADATA wsaData; 
SOCKET sockRaw; 
struct sockaddr_in dest,from,end; 
 
int fromlen =sizeof(from); 
char *recvbuf=new char[MAX_PING_PACKET_SIZE]; 
 
unsigned int addr=0; 
long ThreadNumCounter=0,ThreadNumLimit=20; 
long *aa=&ThreadNumCounter; 
 
void main(int argc,char *argv[]) 
{ 
	if(argc!=3) 
	{ 
		cout<<"输入格式错误: start_ip end_ip"<ThreadNumLimit) 
		{ 
			Sleep(5000); 
			continue; 
		} 
		DWORD ThreadID; 
		sockaddr_in *pIPAddrTemp=new (sockaddr_in); 
 
		if(!pIPAddrTemp) 
		{ 
			cout<<"memory alloc failed"<type=ICMP_RCHO; 
		icmp_hdr->id=(USHORT)GetCurrentThreadId(); 
		datapart=icmp_data+sizeof(IcmpHeader); 
		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; 
		icmphdr=(IcmpHeader *)(buf+iphdrlen); 
 
		 
		 
		if(bytestype!=ICMP_RCHO_REPLY)return; 
	 
		if(icmphdr->id!=(USHORT)GetCurrentThreadId())return; 
 
		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); 
 
		char icmp_data[MAX_PACKET]; 
		 
		memset(icmp_data,0,MAX_PACKET); 
		int datasize=DEF_PACKET_SIZE; 
		datasize+=sizeof(IcmpHeader); 
		fill_icmp_data(icmp_data,datasize); 
		((IcmpHeader*)icmp_data)->checksum=0; 
		((IcmpHeader*)icmp_data)->seg=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"<