[英]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結構?
除此之外,您還應謹慎對待字節序(請參見ntohl和htonl函數),具體取決於您要對其中的數據進行處理(不說)。 另請參閱為什么字節序中的字節順序對字節順序重要? 關於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.