2013-11-22 30 views

回答

2

它轉換buffer的指針struct iphdr然後初始化iph該指針。這是因爲buffer是指向原始字節緩衝區的指針,但在此函數中已知存儲在緩衝區中的字節遵循struct iphdr的格式。因此struct iphdr可用於訪問緩衝區的內容,而不必解釋和操作原始字節。

編輯:澄清(根據評論):演員不復制或轉換任何東西。它基本上只是告訴編譯器「我知道buffer應該包含unsigned char s,但在這個特定時間這些字節實際上是struct iphdr,所以讓我通過指針iph以更方便的方式訪問它們。

+0

(根據與問題鏈接的原始代碼,我使用了小寫名稱「緩衝區」。) – Arkku

+0

這是我如何理解發生的事情,請告訴我,如果我錯了。 'buffer'是一個無符號字符數組,如果'iphdr'的第一個成員是3個無符號字符的數組,那麼它將複製緩衝區的前3個字符,同樣會發生在'iphdr'的更多成員上。謝謝 – maximilliano

0

buffer是指向正用於存儲原始數據包數據的unsigned char數組的指針。

這將重寫buffer的類型,以便將其理解爲指向struct iphdr的指針,因此您可以將其指定給iph並將其作爲結構體讀取。從技術上講,這只是抑制編譯器錯誤,可以說buffer的值不能分配給iph,因爲它們是不同的類型,儘管它們都是指針。

或者,您可以改爲使用void*類型的buffer

一個指向void可以分配給其他任何指針類型,而不需要重鑄它的類型:

void* buffer = malloc(65536); 
... 
void ProcessPacket(void* buffer, int size) { 
    struct iphdr *iph = buffer; 
    ... 
}