2012-12-17 43 views
1

我想幀ICMP數據包並通過原始套接字發送它。望着例子,我看到IP數據包長度的計算公式爲:計算IP標題len

iphdr.ip_hl =的sizeof(結構IP)>> 2

能否請你解釋爲什麼我們通過2需要右移結構IP次而不是分配一個constan值?

+1

*是一個常數值。你在問什麼? –

+0

你有一點。你能展示這些例子嗎?有人只需要4倍於struct ip的大小,這是我在看不到上下文的情況下無法理解的。 – pbhd

+0

@pbhd,大小的1/4,我想。 –

回答

3

IP(或ICMP)數據包的'ip_hl'字段被定義爲IP數據頭的長度,以32位字爲單位。

sizeof(struct ip)產生IP報頭的長度,以8位字節爲單位。如同在ip_hl字段中預期的那樣,將該值右移兩次提供了32位字的長度。

一個不使用常量的好理由是消除源代碼中的幻數。 (無論如何,編譯器會爲'sizeof(struct ip)>> 2')生成一個常量值。

1

由於4位標題長度字段是32位字頭中的數,包括選項,所以它可能是長於20個字節(字段值5),因此它不應該是一個常數值。你的例子只是假設沒有選擇方案。