文章作者 100test 发表时间 2007:03:13 21:44:51
来源 100Test.Com百考试题网
if (argc >3)
{
datasize = atoi(argv[3]).
if (datasize == 0)
datasize = DEF_PACKET_SIZE.
if (datasize >1024) /* 用户给出的数据包大小太大 */
{
fprintf(stderr,"WARNING : data_size is too large !\n").
datasize = DEF_PACKET_SIZE.
}
}
else
datasize = DEF_PACKET_SIZE.
datasize = sizeof(IcmpHeader).
icmp_data = (char*)xmalloc(MAX_PACKET).
recvbuf = (char*)xmalloc(MAX_PACKET).
if (!icmp_data) {
fprintf(stderr,"HeapAlloc failed %d\n",GetLastError()).
ExitProcess(STATUS_FAILED).
}
memset(icmp_data,0,MAX_PACKET).
fill_icmp_data(icmp_data,datasize).
//
//显示提示信息
//
fprintf(stdout,"\nPinging %s ....\n\n",dest_ip).
for(int i=0.i{
int bwrote.
((IcmpHeader*)icmp_data)->i_cksum = 0.
((IcmpHeader*)icmp_data)->timestamp = GetTickCount().
((IcmpHeader*)icmp_data)->i_seq = seq_no .
((IcmpHeader*)icmp_data)->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) {
printf("Request timed out.\n").
continue.
}
fprintf(stderr,"sendto failed: %d\n",WSAGetLastError()).
ExitProcess(STATUS_FAILED).
}
if (bwrote < datasize ) {
fprintf(stdout,"Wrote %d bytes\n",bwrote).
}
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&.from,&.fromlen).
if (bread == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("Request timed out.\n").
continue.
}
fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError()).
ExitProcess(STATUS_FAILED).
}
if(!decode_resp(recvbuf,bread,&.from))
statistic . /* 成功接收的数目 */
Sleep(1000).
}
/*
Display the statistic result
*/
fprintf(stdout,"\nPing statistics for %s \n",dest_ip).
fprintf(stdout," Packets: Sent = %d,Received = %d, Lost = %d (%2.0f%% loss)\n",times,
statistic,(times-statistic),(float)(times-statistic)/times*100).
WSACleanup().
return 0.
}
/*
The response is an IP packet. We must decode the IP header to locate
the ICMP data
*/
int decode_resp(char *buf, int bytes,struct sockaddr_in *from) {
IpHeader *iphdr.
IcmpHeader *icmphdr.
unsigned short iphdrlen.
iphdr = (IpHeader *)buf.
iphdrlen = (iphdr->h_len) * 4 . // number of 32-bit words *4 = bytes
if (bytes < iphdrlen ICMP_MIN) {
printf("Too few bytes from %s\n",inet_ntoa(from->sin_addr)).
}
icmphdr = (IcmpHeader*)(buf iphdrlen).
if (icmphdr->i_type != ICMP_ECHOREPLY) {
fprintf(stderr,"non-echo type %d recvd\n",icmphdr->i_type).
return 1.
}
if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) {
fprintf(stderr,"someone else s packet!\n").
return 1.
}
printf("%d bytes from %s:",bytes, inet_ntoa(from->sin_addr)).
printf(" icmp_seq = %d. ",icmphdr->i_seq).
printf(" time: %d ms ",GetTickCount()-icmphdr->timestamp).
printf("\n").
return 0.
}
USHORT checksum(USHORT *buffer, int size) {
unsigned long cksum=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).
}
/*
Helper function to fill in various stuff in our ICMP request.
*/
void fill_icmp_data(char * icmp_data, int datasize){
IcmpHeader *icmp_hdr.
char *datapart.
icmp_hdr = (IcmpHeader*)icmp_data.
icmp_hdr->i_type = ICMP_ECHO.
icmp_hdr->i_code = 0.
icmp_hdr->i_id = (USHORT)GetCurrentProcessId().
icmp_hdr->i_cksum = 0.
icmp_hdr->i_seq = 0.
datapart = icmp_data sizeof(IcmpHeader).
//
// Place some junk in the buffer.
//
memset(datapart, E , datasize - sizeof(IcmpHeader)).
}
/******************* 附: ping命令执行时显示的画面 ***************\
* C:\Documents and Settings\houzhijiang>ping 236.56.54.12 *
* *
* Pinging 236.56.54.12 with 32 bytes of data: *
* *
* Request timed out. *
* Request timed out. *
* Request timed out. *
* Request timed out. *
* *
* Ping statistics for 236.56.54.12: *
* Packets: Sent = 4, Received = 0, Lost = 4 (100% loss), *
* *
\*********************************************************/
/*********************************************************\
* C:\Documents and Settings\houzhijiang>ping 127.0.0.1 *
* *
* Pinging 127.0.0.1 with 32 bytes of data: *
* *
* Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 *
* Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 *
* Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 *
* Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 *
* *
* Ping statistics for 127.0.0.1: *
* Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), *
* Approximate round trip times in milli-seconds: *
* Minimum = 0ms, Maximum = 0ms, Average = 0ms *
* *
相关文章
Microsoft培训教师认证MCT
第三方开发插件为Office与ODF开放格式牵线
Microsoft专家认证MCP
微软ping程序源代码完整版(下)
Microsoft应用软件开发者认证MCAD
微软ping程序源代码完整版(上)
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛