icmp是(internet control message protocol)internet控制
報文協議。它是
tcp/ip協議族
的乙個子協議,用於在ip主機、
路由器之間傳遞控制訊息。控制訊息是指
網路通不通、
主機是否可達、
路由是否可用等網路本身的訊息。這些控制訊息雖然並不傳輸使用者資料,但是對於使用者資料的傳遞起著重要的作用。
unsigned short cal_chksum(unsigned short *addr, int len)
if( nleft == 1)
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return answer;
}int ping( char *ips, int timeout)
timeo.tv_sec = timeout / 1000;
timeo.tv_usec = timeout % 1000;
if (setsockopt(sockfd, sol_socket, so_sndtimeo, &timeo, sizeof(timeo)) == -1)
memset(sendpacket, 0, sizeof(sendpacket));
// pid ping sequence id
pid=getpid();
int i,packsize;
icmp=(struct icmp*)sendpacket;
icmp->icmp_type=icmp_echo;
icmp->icmp_code=0;
icmp->icmp_cksum=0;
icmp->icmp_seq=0;
icmp->icmp_id=pid;
packsize=8+56;
tval= (struct timeval *)icmp->icmp_data;
gettimeofday(tval,null);
icmp->icmp_cksum=cal_chksum((unsigned short *)icmp,packsize);
n = sendto(sockfd, (char *)&sendpacket, packsize, 0, (struct sockaddr *)&addr, sizeof(addr));
if (n < 1)
countnum = 0;
while(countnum++//accept
memset(recvpacket, 0, sizeof(recvpacket));
int fromlen = sizeof(from);
n = recvfrom(sockfd, recvpacket, sizeof(recvpacket), 0, (struct sockaddr *)&from, &fromlen);
if (n < 1)
// check this echo reply if belong to myself
char *from_ip = (char *)inet_ntoa(from.sin_addr);
printf("fomr ip:%s.\n",from_ip);
if (strcmp(from_ip,ips) != 0)
iph = (struct ip *)recvpacket;
icmp=(struct icmp *)(recvpacket + (iph->ip_hl<<2));
printf("ip:%s,icmp->icmp_type:%d,icmp->icmp_id:%d.\n",ips,icmp->icmp_type,icmp->icmp_id);
//check reply contents
if (icmp->icmp_type == icmp_echoreply && icmp->icmp_id == pid)
else
}close(sockfd);
if(ret == success)
else
return ret;
}
ICMP協議之ping實現
1.相關icmp協議概述 這裡只講解與ping有關的icmp訊息型別,主機傳送回送訊息 type 8 被請求主機回送響應訊息 type 0 基本格式如下 回送訊息 echo 回送響應訊息 echo reply 其中 code 0,checksum為校驗和,重點注意從icmp的頭部 即type開始 到...
ping 原理與ICMP協議
ping 原理與icmp協議 ping的原理 ping程式是用來探測主機到主機之間是否可通訊,如果不能ping到某台主機,表明不能和這台主機建立連線。ping使用的是icmp協議,它傳送icmp回送請求訊息給目的主機。icmp協議規定 目的主機必須返回icmp回送應答訊息給源主機。如果源主機在一定時...
ping 原理與ICMP協議
ping 的原理 ping 程式是用來探測主機到主機之間是否可通訊,如果不能ping到某台主機,表明不能和這台主機建立連線。ping 使用的是icmp協議,它傳送icmp回送請求訊息給目的主機。icmp協議規定 目的主機必須返回icmp回送應答訊息給源主機。如果源主機在一定時間內收到應答,則認為主機...