PING的源代码Word文档下载推荐.docx
- 文档编号:19378087
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:17
- 大小:19.23KB
PING的源代码Word文档下载推荐.docx
《PING的源代码Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PING的源代码Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
BYTE i_type;
//8位类型
BYTE i_code;
//8位代码
USHORTi_cksum;
//16位校验和
USHORTi_id;
//识别号(一般用进程号作为识别号)
USHORTi_seq;
//报文序列号
ULONG timestamp;
//时间戳
}ICMP_HEADER;
SOCKET sockRaw=INVALID_SOCKET;
char *lpdest=NULL;
int time=1000;
//超时值
structsockaddr_in dest,
from;
//函数声明
voidCheckSockError(int,char*);
//出错处理函数
voidusage(void);
//使用说明
boolGetCmdLine(intargc,char**argv);
//命令行处理函数
voidFillICMPData(char*icmp_data,intdatasize);
//填充ICMP数据包
voidDecodeICMPHeader(char*buf,intbytes,structsockaddr_in*from);
//ICMP
解包程序
USHORTchecksum(USHORT*buffer,intsize);
//计算检验和
//主函数
intmain(intargc,char**argv)
int datasize=DEF_PACKET_SIZE;
int timeout =0;
char *icmp_data=NULL,
*recvbuf =NULL;
USHORT seq_no=0;
int iErrorCode;
structhostent *hp=NULL;
//命令行参数处理
if(GetCmdLine(argc,argv)==CMD_PARAM_HELP)
usage();
ExitProcess(0);
}
//初始化SOCKET
WSADATAwsaData;
iErrorCode=WSAStartup(MAKEWORD(2,2),&
wsaData);
CheckSockError(iErrorCode,"
WSAStartup"
);
sockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
CheckSockError(sockRaw,"
socket"
//设置超时时间
timeout=time;
iErrorCode=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&
timeout,sizeo
f(timeout));
SO_RCVTIMEO"
iErrorCode=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&
SO_SNDTIMEO"
//获得目标主机IP
memset(&
dest,0,sizeof(dest));
dest.sin_family=AF_INET;
if((dest.sin_addr.s_addr=inet_addr(lpdest))==INADDR_NONE)
if((hp=gethostbyname(lpdest))!
=NULL)
{
memcpy(&
(dest.sin_addr),hp->
h_addr_list[0],hp->
h_length);
dest.sin_family=hp->
h_addrtype;
printf("
dest.sin_addr=%s\n"
inet_ntoa(dest.sin_addr));
}
else
CheckSockError(SOCKET_ERROR,"
gethostbyname()"
//创建ICMP数据包
datasize+=sizeof(ICMP_HEADER);
icmp_data=(char*)malloc(MAX_PACKET);
recvbuf =(char*)malloc(MAX_PACKET);
if((!
icmp_data)||(!
recvbuf))
CheckSockError(SOCKET_ERROR,"
malloc()"
memset(icmp_data,0,MAX_PACKET);
FillICMPData(icmp_data,datasize);
printf("
Pinging%swith%dbytesofdata(timeout=%dms):
\n\n"
inet_ntoa(de
st.sin_addr),datasize,timeout);
//发送与接收ICMP数据包
while
(1)
memset(recvbuf,0,MAX_PACKET);
staticintnCount=0;
if(nCount++==4)break;
((ICMP_HEADER*)icmp_data)->
i_cksum=0;
timestamp=GetTickCount();
i_seq=seq_no++;
i_cksum=
checksum((USHORT*)icmp_data,datasize);
iErrorCode=sendto(sockRaw,icmp_data,datasize,0,(structsockaddr*)&
dest,s
izeof(dest));
if(iErrorCode==SOCKET_ERROR)
if(WSAGetLastError()==WSAETIMEDOUT)
{
printf("
timedout\n"
continue;
}
sendto()"
if(iErrorCode<
datasize)
Wrote%dbytes\n"
iErrorCode);
intfromlen=sizeof(from);
iErrorCode=recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(structsockaddr*)&
from
&
fromlen);
recvfrom()"
}
DecodeICMPHeader(recvbuf,iErrorCode,&
from);
Sleep(1000);
//退出前清理
if(sockRaw!
=INVALID_SOCKET)closesocket(sockRaw);
free(icmp_data);
free(recvbuf);
WSACleanup();
return0;
//SOCK错误处理程序
voidCheckSockError(intiErrorCode,char*pErrorMsg)
if(iErrorCode==SOCKET_ERROR)
printf("
%sError:
%d\n"
pErrorMsg,GetLastError());
closesocket(sockRaw);
//使用说明
voidusage(void)
spingforWin2K\n"
\tUsage:
"
\tsping.exe[-wtimeout]destination\n"
\n\tOptions:
\n"
\t -wtimeout\tTimeoutinmillisecondstowaitforeachreply.\n"
;
boolGetCmdLine(intargc,char**argv)
if(argc<
2)returnCMD_PARAM_HELP;
for(inti=0;
i<
argc;
i++)
if(argv[i][0]==‘-‘)
switch(tolower(argv[i][1]))
{
case‘w‘:
time=atoi(argv[++i]);
break;
default:
returnCMD_PARAM_HELP;
}
}
}
lpdest=argv[argc-1];
return(!
CMD_PARAM_HELP);
//填充数据
voidFillICMPData(char*icmp_data,intdatasize)
ICMP_HEADER*icmp_hdr=NULL;
char *datapart=NULL;
icmp_hdr=(ICMP_HEADER*)icmp_data;
icmp_hdr->
i_type=ICMP_ECHO;
//RequestanICMPecho
i_code=0;
i_id=(USHORT)GetCurrentProcessId();
i_seq=0;
datapart=icmp_data+sizeof(ICMP_HEADER);
//
//Placesomejunkinthebuffer
memset(datapart,‘E‘,datasize-sizeof(ICMP_HEADER));
//计算检验和
USHORTchecksum(USHORT*buffer,intsize)
unsignedlongcksum=0;
while(size>
1)
{
cksum+=*buffer++;
size-=sizeof(USHORT);
if(size)
cksum+=*(UCHAR*)buffer;
cksum=(cksum>
>
16)+(cksum&
0xffff);
cksum+=(cksum>
16);
return(USHORT)(~cksum);
//ICMP解包程序
voidDecodeICMPHeader(char*buf,intbytes,structsockaddr_in*from)
IP_HEADER *iphdr=NULL;
ICMP_HEADER *icmphdr=NULL;
unsignedshort iphdrlen;
DWORD tick;
iphdr=(IP_HEADER*)buf;
//Numberof32-bitwords*4=bytes
iphdrlen=sizeof(unsignedlong)*(iphdr->
h_lenver&
0xf);
tick=GetTickCount();
if(bytes <
iphdrlen+ICMP_MIN)
printf("
Toofewbytesfrom%s\n"
inet_ntoa(from->
sin_addr));
icmphdr=(ICMP_HEADER*)(buf+iphdrlen);
if(icmphdr->
i_type!
=ICMP_ECHOREPLY)
nonechotype%drecvd\n"
icmphdr->
i_type);
return;
//MakesurethisisanICMPreplytosomethingwesent!
i_id!
=(USHORT)GetCurrentProcessId())
someoneelse‘spacket!
return;
%dbytesfrom%s:
bytes,inet_ntoa(from->
icmp_seq=%d."
i_seq);
time:
%dms"
tick-icmphdr->
timestamp);
return;
#pragmapack(4)
#defineWIN32_LEAN_AND_MEAN
stdlib.h>
#defineICMP_ECHO8
#defineICMP_ECHOREPLY0
#defineICMP_MIN8//minimum8byteicmppacket(justheader)
/*TheIPheader*/
typedefstructiphdr{
unsignedinth_len:
4;
//lengthoftheheader
unsignedintversion:
//VersionofIP
//Typeofservice
//totallengthofthepacket
//uniqueidentifier
//flags
//protocol(TCP,UDPetc)
//IPchecksum
}IpHeader;
//
//ICMPheader
typedefstruct_ihdr{
BYTEi_type;
BYTEi_code;
/*typesubcode*/
/*Thisisnotthestdheader,butwereservespacefortime*/
ULONGtimestamp;
}IcmpHeader;
#defineSTATUS_FAILED0xFFFF
#defineDEF_PACKET_SIZE32
#defineMAX_PACKET1024
#definexmalloc(s)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#definexfree(p)HeapFree(GetProcessHeap(),0,(p))
voidfill_icmp_data(char*,int);
USHORTchecksum(USHORT*,int);
voiddecode_resp(char*,int,structsockaddr_in*);
voidUsage(char*progname){
fprintf(stderr,"
Usage:
%s<
host>
[data_size]\n"
progname);
datasizecanbeupto1Kb\n"
ExitProcess(STATUS_FAILED);
intmain(intargc,char**argv){
SOCKETsockRaw;
structsockaddr_indest,from;
structhostent*hp;
intbread,datasize;
intfromlen=sizeof(from);
inttimeout=1000;
char*dest_ip;
char*icmp_data;
char*recvbuf;
unsignedintaddr=0;
USHORTseq_no=0;
if(WSAStartup(MAKEWORD(2,1),&
wsaData)!
=0){
WSAStartupfailed:
%d\n"
GetLastError());
2){
Usage(argv[0]);
sockRaw=WSASocket(AF_INET,
SOCK_RAW,
IPPROTO_ICMP,
NULL,0,0);
if(sockRaw==INVALID_SOCKET){
WSASocket()failed:
WSAGetLastError());
bread=setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&
timeout,
sizeof(timeout));
if(bread==SOCKET_ERROR){
failedtosetrecvtimeout:
timeout=1000;
bread=setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&
failedtosetsendtimeout:
hp=gethostbyname(argv[1]);
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PING 源代码