ping 實現設計 ICMP

2021-09-06 06:32:28 字數 2564 閱讀 1365

傳送icmp報文時,必須程式自己計算校驗和,將它填入icmp頭部對應的域中。

校驗和的計算方法:

將資料以字為單位累加到乙個雙字中,如果資料長度為奇數,最後乙個位元組將被擴充套件到字,累加的結果是乙個雙字,最後將這個雙字的高16位,低16位相加後取反,便得到了校驗和。

下面是checksum的計算校驗和的**:

ushort checksum(ushort* buff, int

size)

//是奇數

if(size)

//將32位的chsum高16位和低16位相加,然後取反

cksum = (cksum >> 16) + (cksum & 0xffff

); cksum += (cksum >> 16

);

return (ushort)(~cksum);

}

ping程式例項:

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開始 到...