2015-04-07 69 views
1

我正在C中使用TCP Dump數據包捕獲方法,我正在查看TCP標誌部分,我需要一種方法來檢查SYN標誌是否設置在包。TCP標誌過濾器的十六進制,按位或反轉

當我運行程序時,我可以訪問下面的結構中的th_flags變量,並且我得到一個類似於6144或4096的值作爲回報。我如何根據輸出的數字來確定哪些標誌被設置?

struct sniff_tcp { 
    u_short th_sport;    /* source port */ 
    u_short th_dport;    /* destination port */ 
    tcp_seq th_seq;     /* sequence number */ 
    tcp_seq th_ack;     /* acknowledgement number */ 
    u_char th_offx2;    /* data offset, rsvd */ 
    #define TH_OFF(th)  (((th)->th_offx2 & 0xf0) >> 4) 
    u_char th_flags; 
    #define TH_FIN 0x01 
    #define TH_SYN 0x02 
    #define TH_RST 0x04 
    #define TH_PUSH 0x08 
    #define TH_ACK 0x10 
    #define TH_URG 0x20 
    #define TH_ECE 0x40 
    #define TH_CWR 0x80 
    #define TH_FLAGS  (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) 
    u_short th_win;     /* window */ 
    u_short th_sum;     /* checksum */ 
    u_short th_urp;     /* urgent pointer */ 
}; 

我需要能夠來測試使用格式if (SYN is set) {...}各種標誌。

如果我要訪問的目的端口可變我這樣做:

printf(" Dst port: %d\n", ntohs(tcp->th_dport)); 

由於內部的`struct`定義....奇

+1

嵌套'#define's。 ..混亂......難以閱讀......無論如何,你是否嘗試過'if(some_packet.th_flags&TH_SYN)...'?這似乎是一個開始的好地方... – twalberg

+0

@twalberg printf(「Dst port:%d \ n」,ntohs(tcp-> th_dport));是我如何訪問其他變量,我將如何做到這一點的國旗? (我沒有編寫代碼+更多的是java人員:p) – Crizly

+1

1)對於單字節變量(如th_flags),您不需要'ntohs()',儘管它並不會真的傷害任何東西,要麼; 2)'(tcp - > th_port)&TH_SYN' ... – twalberg

回答

-1
if (tcp ->th_flags & TH_SYN) 
{ 
    //TH_SYN is set 
}