2012-02-16 28 views
1

而linux /文件夾包含ip.h頭文件,其特徵在於,IP報頭的結構的部分被定義如下:以逐位與在__be 32型的Linux內核模塊

struct iphdr 
{ 
    // ... 
    __be32 saddr; 
    __be32 daddr; 
}; 

我有一個情況其中我有一個char *類型的源網絡掩碼。我想檢查__be32類型的IP地址是否屬於類型爲char *的網絡。我可以使用linux/inet.h中提供的in_aton()將網絡掩碼和網絡地址轉換爲__be32。

char * network_addr = "192.166.0.0"; 
char * netmask = "255.255.0.0"; 

有人可以告訴我怎麼可以把布爾& &地址爲__be32類型,或只是將& &運營商將給出正確的結果。

謝謝。

+0

你是指'&&'或'&'? – asaelr 2012-02-16 20:05:16

+0

只要兩個操作數使用相同的順序,字節順序對於按位運算符無關緊要。事情需要排隊,但地點價值沒有任何區別。 – 2012-02-16 20:36:25

回答

1

您正在尋找位AND運算符&,而不是邏輯運算符&&

__be32 addr; 
__be32 addr_mask; 
... 
__be32 addr_masked = addr & addr_mask; 

記住的IPv4不會忽略的32位數字:4個8位字節

0

記住__be32是大端字節順序中的32位值,可能與主機字節順序不匹配。尋找像be32toh這樣的字節交換例程來轉換爲主機字節順序以進行比較。

same_network = (my_addr & addr_mask) == (be32toh(his_addr_be) & addr_mask); 
+0

我將所有的值轉換爲__be32,然後進行比較,所以所有的值都有相同的字節順序 – Jake 2012-02-17 15:02:40