傳送icmp報文時,必須程式自己計算校驗和,將它填入icmp頭部對應的域中。
校驗和的計算方法:
將資料以字為單位累加到乙個雙字中,如果資料長度為奇數,最後乙個位元組將被擴充套件到字,累加的結果是乙個雙字,最後將這個雙字的高16位,低16位相加後取反,便得到了校驗和。
下面是checksum的計算校驗和的**:
ushort checksum(ushort* buff, intping程式例項:size)
//是奇數
if(size)
//將32位的chsum高16位和低16位相加,然後取反
cksum = (cksum >> 16) + (cksum & 0xffff
); cksum += (cksum >> 16
);
return (ushort)(~cksum);
}
ping用來檢查主機是否存在,是否可達。
下面是ping的執行步驟:
1 建立協議型別為ipproto_icmp的原始套接字
2 建立並初始化icmp封包
3 呼叫sendto函式向遠端主機傳送icmp請求
4 呼叫recvfrom函式接收icmp響應
完整**如下:
/////執行結果:ping.cpp檔案
#include
"../common/initsock.h
"#include
"../common/protoinfo.h
"#include
#include
#include
#include
"ws2tcpip.h
"cinitsock thesock;
typedef
struct
icmp_hdr
icmp_hdr, *picmp_hdr;
ushort checksum(ushort* buff, int
size);
bool setttl(socket s,
intnvalue);
bool settimeout(socket s,
int ntime, bool brecv =true);
ushort checksum(ushort* buff, int
size)
//是奇數
if(size)
//將32位的chsum高16位和低16位相加,然後取反
cksum = (cksum >> 16) + (cksum & 0xffff
); cksum += (cksum >> 16
);
return (ushort)(~cksum);
}bool setttl(socket s,
intnvalue)
bool settimeout(socket s,
intntime, bool brecv)
intmain()
nret = ::recvfrom(sraw, recvbuf, 1024, 0, (sockaddr*)&from, &nlen);
if(nret ==socket_error)
printf(
"recvfrom() failed: %d\n
", ::wsagetlasterror());
return -1
; }
//下面開始解析接收到的icmp封包
int ntick =::gettickcount();
if(nret < sizeof(ipheader) + sizeof
(icmp_hdr))
//接收到的資料中包含ip頭,ip頭大小為20個位元組,所以加20得到icmp頭
icmp_hdr* precvicmp = (icmp_hdr*)(recvbuf + 20); //
(icmp_hdr*)(recvbuf + sizeof(ipheader));
if(precvicmp->icmp_type != 0) //
回顯
if(precvicmp->icmp_id !=::getcurrentprocessid())
printf(
"%d bytes from %s:
", nret, inet_ntoa(from
.sin_addr));
printf(
"icmp_seq = %d.
", precvicmp->icmp_sequence);
printf(
"time: %d ms
", ntick - precvicmp->icmp_timestamp);
printf("\n
");::sleep(
1000
); }
return0;
}
ICMP協議之ping實現
1.相關icmp協議概述 這裡只講解與ping有關的icmp訊息型別,主機傳送回送訊息 type 8 被請求主機回送響應訊息 type 0 基本格式如下 回送訊息 echo 回送響應訊息 echo reply 其中 code 0,checksum為校驗和,重點注意從icmp的頭部 即type開始 到...
ICMP協議之ping實現
1.相關icmp協議概述 這裡只講解與ping有關的icmp訊息型別,主機傳送回送訊息 type 8 被請求主機回送響應訊息 type 0 基本格式如下 回送訊息 echo 回送響應訊息 echo reply 其中 code 0,checksum為校驗和,重點注意從icmp的頭部 即type開始 到...
ICMP協議之ping實現
1.相關icmp協議概述 這裡只講解與ping有關的icmp訊息型別,主機傳送回送訊息 type 8 被請求主機回送響應訊息 type 0 基本格式如下 回送訊息 echo 回送響應訊息 echo reply 其中 code 0,checksum為校驗和,重點注意從icmp的頭部 即type開始 到...