簡體   English   中英

在C中創建IP標頭

[英]Create IP Header in C

我正在嘗試在C中創建IP標頭。

typedef struct header
{
    //IP-Header
    unsigned char ip_v:4, ip_hl:4;/* this means that each member is 4 bits */
    unsigned char ip_tos;       //1 Byte
    unsigned short int ip_len;  //2 Byte
    unsigned short int ip_id;   //2 Byte
    unsigned short int ip_off;  //2 Byte
    unsigned char ip_ttl;       //1 Byte
    unsigned char ip_p;         //1 Byte
    unsigned short int ip_sum;  //2 Byte
    unsigned int ip_src;        //4 Byte
    unsigned int ip_dst;        //4 Byte


} __attribute__((packed)) ipheader;

現在,我想使用struct並將十六進制值保存在變量中。

int main()
{
    ipheader iph;

    iph.ip_v='\x4';
    iph.ip_hl='\x5';
    iph.ip_tos='\x00';

    return 0;
}

如何將103C寫入iph.ip_len 這種結構是存儲IP標頭的好方法嗎?

如何使用iphdr結構?

除此之外,您還應謹慎對待字節序(請參見ntohlhtonl函數),具體取決於您要對其中的數據進行處理(不說)。 另請參閱為什么字節序中的字節順序對字節順序重要? 關於iphdr的偏執。

為了編寫值本身,您可以使用所使用的標准/編譯器允許的任何格式,例如,如果您使用帶有適當標志,八進制或十進制或字符數組的正確GCC版本,則使用二進制文字。

以下是一些不同文字格式的示例:

十六進制: 0x103C

字符數組: (char *){ 10, 60 }(char *){ 10, '<' }

八進制: 010074

二進制: 0b1000000111100

如果您不希望在不同類型之間移動值或對它們進行一些時髦的數學運算,則甚至不需要強制轉換-否則編譯器會將值解釋為int ,這可能對您造成問題,尤其是因為不同的簽名。 在這種情況下,只需加上前綴(uint16_t)或您需要的任何前綴即可(uint16_t)您應該使用系統中定義的相同類型-參見答案頂部的有關iphdr的建議-或固定長度的定義,以避免可移植性問題或問題)未來的更新)

您可以為其分配值:

iph.ip_len = (unsigned short int)0x103C;

您實際分配的其他字符。 我不確定這是否是您的意圖。

因此,在iph.ip_v='\\x4''\\x4'實際上代表一個字符,然后將其分配給ip_v成員(截斷為4位)。 但是您可能剛剛編寫了iph.ip_v=0x04

采用:

unsigned char ip_hl:4, ip_v:4;

要么

int ip_vhl; // version and header togather
#define IP_HL(ip) (((ip)->ip_vhl) & 0x0f) //split header length
#define IP_V(ip) (((ip)->ip_vhl) >> 4) //split IP version

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM