tft每日頭條

 > 生活

 > 原生socket套接字實現ICMP協議

原生socket套接字實現ICMP協議

生活 更新时间:2024-07-20 07:14:03

原生socket套接字實現ICMP協議(原生socket套接字實現ICMP協議)1

版權聲明:本文為作者原創文章,可以随意轉載,但必須在明确位置表明出處!!!

前一篇文章講了TCP協議,本篇文章我覺得有必要去實現一種協議,讓我們更深刻的去理解協議内容,所以本篇文章選擇ICMP(Internet Control Message Protocol)Internet控制報文協議,它是一種網絡層協議,相信各位都使用過ping命令,監測主機和主機之間能夠聯通,而ping命令就是使用的ICMP協議,下面我們就用socket實現一個ping程序。

ping命令過程

1.Ping命令加上一個主機地址或者域名

2.等待對方主機應答。

3.統計發送接收次數,是否有丢包。

ICMP不能單獨傳輸,它需要封裝在IP數據報裡。如下圖所示:

原生socket套接字實現ICMP協議(原生socket套接字實現ICMP協議)2

發送ICMP數據報需要填充ICMP頭部信息,頭部 發送的數據部分組成一個ICMP報文。填充頭部的意義是設置你想要的結果。ICMP頭部占8個字節。類型一個字節,代碼一個字節,校驗和兩個字節,标識符兩個字節,序列号兩個字節。類型和代碼的組合可以表達不同的意義。這裡我們會用到類型8代碼0;表示的是ECHO請求。當對方主機返回類型為0時,表示ECHO應答。IP首部占20個字節下面給出ICMP頭部和IP頭部的定義。

ICMP報文類型

原生socket套接字實現ICMP協議(原生socket套接字實現ICMP協議)3

ICMP頭部定義

原生socket套接字實現ICMP協議(原生socket套接字實現ICMP協議)4

下面我們就要填充ICMP頭部信息

原生socket套接字實現ICMP協議(原生socket套接字實現ICMP協議)5

icmp_hdr->id = (USHORT)GetCurrentProcesId();這裡的ID是唯一的标識符,他的作用是從應答中找到屬于我發起的請求應答,是什麼意思呢,一個網絡地址可能同時有多個人去PING一台主機,那麼主機返回的數據誰去接受呢?其實就是用ID來決定的,比如A、B兩個用戶,他們都ping同一台主機,A的ID = 1 B的ID = 2;那麼主機返回的時候這個ID值是不會改變的,A判斷ID == 1 就表示我返回我要接受的數據,同理B判斷ID == 2,就是這個意思。

icmp_hdr->timestamp = GetTickCount();主要是用來記錄請求應答的時間,當發送ECHO請求時記錄發送時間,當接受到應答數據時,在用GetTickcount()- icmp_hdr->itmestamp這樣就能得到請求應答需要多少時間了。

發送ICMP數據使用原始套接字,用sendto(···)函數,函數的接受可以查看MSDN關于本文的所有API函數都可以通過MSDN查看,多查看MSDN對我們提高英文能力,和學習能力都有很好的幫助,學習編程一定要多查看文檔,遇到API先看文檔,如果不是很明白在去百度,google這樣會好一些。

下面是接受到ECHO應答後解析數據的過程:

原生socket套接字實現ICMP協議(原生socket套接字實現ICMP協議)6

下面是接受數據:

原生socket套接字實現ICMP協議(原生socket套接字實現ICMP協議)7

下面是發送請求數據

原生socket套接字實現ICMP協議(原生socket套接字實現ICMP協議)8

okay, 就講到這裡了,各位讀者可以自己動手去試試,當然如果你們需要demo的也可以私信我。


歡迎關注我:「愛做飯的老謝」,老謝一直在努力...

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved