2013-04-10 98 views
0

我有許多(百萬)IP4和IP6地址的文本文件。我需要儘快閱讀所有內容。從文件中讀取IP地址的最有效方法

我知道inet_pton,但我不知道地址是IP4還是IP6,所以我需要做「嘗試和錯誤」的方法,我嘗試IP4,如果失敗,請嘗試IP6。但是我不喜歡這個解決方案,因爲當IP6是IP4時,我會不必要地解析IP4。

+0

它是一個文本文件嗎?如果該文件不包含類型信息,那麼您還能如何做到這一點?如果沒有至少查看一些*數據以確定它是否符合標準,您就不會奇蹟般地知道該類型。 – unwind 2013-04-10 09:29:19

+0

@unwind文本文件。最好的辦法是有一些智能功能,可以有效地嘗試解析並返回一個適合的函數。 C#確實有一個。 – Euphoric 2013-04-10 09:31:39

+0

而C#的功能可能在內部執行相同的「試錯法」。 – interjay 2013-04-10 09:34:43

回答

0

我認爲,所有你需要做的是從當前行解析字符,直到你打任何非十進制數字(因爲IPv6使用十六進制,而IPv4的一般不會,如果我們可以假設點分十進制)或冒號。

如果你點擊一個點,而你知道該線路是IPv4地址,否則它是IPv6。

最多四個字節的額外解析應該是確實是快。

這裏是在執行這一分類功能的嘗試:

int get_af(const char *address) 
{ 
    while(isdigit((unsigned int) *address)) 
    ++address; 
    if(*address == '.') 
    return AF_INET; 
    if(*address == ':' || isxdigit((unsigned int) *address)) 
    return AF_INET6; 
    return -1; 
} 

以上假設既不AF_INET也不AF_INET6爲-1,因爲這是用於錯誤的報告。這可能需要調整。

相關問題