2011-03-25 79 views
-1

朋友, 我想比較2個IP地址,以便我可以comare比其他更「/特定」或「限制」。 那麼是否有任何函數/庫可能有助於在C中進行比較(在Ubuntu 10.10上)?比較IP地址與C編程

再見

+0

你能定義*特定*和*限制*嗎? – chrisaycock 2011-03-25 15:29:12

+0

呃什麼......? – stefan 2011-03-25 15:29:32

+0

不完全確定你的意思。請澄清。 – 2011-03-25 15:30:24

回答

1

如果兩個IP地址都以字符串形式,我會用的strtok()來打破各(IPv4)的IP地址爲四個子和比較的子字符串中的兩個IP地址字符串,即:

char ipaddr1[16] = "192.168.1.1';  
    char ipaddr2[16] = "127.0.0.1'; 

變爲:

char ipaddr1_byte0[4] = "192"; 
    char ipaddr1_byte1[4] = "168"; 
    char ipaddr1_byte2[4] = "1"; 
    char ipaddr1_byte3[4] = "1"; 

    char ipaddr2_byte0[4] = "127"; 
    char ipaddr2_byte1[4] = "0"; 
    char ipaddr2_byte2[4] = "0"; 
    char ipaddr2_byte3[4] = "1"; 

好像你應該能夠使用

same = strcmp(ipaddr1_byte0, ipaddr2_byte0); 

和所有四對類似,但您可能必須通過調用每個字節值atoi()將每個字節變成一個int;然後比較整數。

如果(IPv4)的IP地址是在INT形式,則該過程是類似的,除了四個子串必須被轉換成8位整數,而不是字符串:

int ipaddr1 = 0xc0a80101;  // 192.168.1.1  
    int ipaddr2 = 0xff000001;  // 127.0.0.1 

變爲:

int ipaddr1_byte0 = 0xff & ipaddr1 >> 24; // 192 or 0xc0 
    int ipaddr1_byte1 = 0xff & ipaddr1 >> 16; // 168 or 0xa8 
    int ipaddr1_byte2 = 0xff & ipaddr1 >> 8; // 1 
    int ipaddr1_byte3 = 0xff & ipaddr1;  // 1 

    int ipaddr2_byte0 = 0xff & ipaddr1 >> 24; // 127 or 0xff 
    int ipaddr2_byte1 = 0xff & ipaddr1 >> 16; // 0 
    int ipaddr2_byte2 = 0xff & ipaddr1 >> 8; // 0 
    int ipaddr2_byte3 = 0xff & ipaddr1;  // 1 

這些8位字節中的每一個都必須與所有其他三個字節分開處理,並且與IP地址分開處理爲一個32位整數。督察,不要以爲你可以使一個IP地址這種方式:

int ipaddr1 = 192168001001; // DOES NOT WORK 

,因爲它不會工作

相反,你必須這樣做:

int ipaddr1 = (192 << 24) | (168 << 16) | (1 << 8) | 1; // don't add these; inclusive-or them together 

- 皮特

+0

你會更好地使用strtok_r()而不是strtok()。在C99中,它不是線程安全的,所以假設你將在線程環境中使用它,在某些時候使用可重入strtok_r()更安全。 – 2011-03-25 16:36:33

+0

絕對正確,謝謝。 – 2011-03-25 17:08:47