2010-05-05 31 views
1
#define IPTOSBUFFERS 12 
char *iptos(u_long in) 
{ 
    static char output[IPTOSBUFFERS][3*4+3+1]; 
    static short which; 
    u_char *p; 

    p = (u_char *)∈ 
    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1); 
    _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]),"%d.%d.%d.%d", p[0], p[1], p[2], p[3]); 
    return output[which]; 
} 

有什麼我很想理解它嗎?你能解釋一下這個ip_to_string函數是如何工作的嗎?

+1

你不瞭解什麼?它看起來像是一個無符號的long,並且不幸的是它返回一個帶有懸掛指針的ip字符串表示。 – WhirlWind 2010-05-05 15:51:57

+0

'172.16.48.1'的u_long是什麼? – user198729 2010-05-05 15:53:53

+1

172 * 256^3 + 16 * 256^2 + 48 * 256^1 + 1 – WhirlWind 2010-05-05 15:56:11

回答

1

這是一個答案,基於似乎令人困惑的評論。

IP地址通常在內部表示爲32位。它通常表示爲4個十進制字段,範圍從0到255.要從十進制表示轉換爲32位表示,簡單地將字段從十進制轉換爲二進制(或十六進制),從左到右,並將它們連接起來。

因此,1.2.3.4變爲字段0x01,0x02,0x03和0x04。因此,它們的32位(無符號長整型)表示是:0x01020304。當然,這也受字節順序的限制...

要將32位地址作爲字符串打印,只需查看構成它的四組8位數據中的每一組,然後將它們打印爲十進制有點之間的整數。

2

附加說明下面爲您的享受:

// This is the number of IP string buffers. 
#define IPTOSBUFFERS 12 

char *iptos(u_long in) 
{ 
    // 12 buffers, each big enough to hold maximum-sized IP address 
    // and nul terminator. 
    static char output[IPTOSBUFFERS][3*4+3+1]; 

    // Last buffer used. 
    static short which; 

    // Get uns. char pointer to IP address. 
    u_char *p; 
    p = (u_char *)∈ 

    // Move to next string buffer, wrapping if necessary. 
    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1); 

    // Output IP address by accessing individual unsigned chars in it. 
    _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]), 
     "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); 

    // Return the current buffer. 
    return output[which]; 
} 

它的工作原理是因爲IPv4地址的表示是在存儲器中的32位的值,並且每個所述四個區段的佔據每一個八位字節。因此,將32位整數的地址轉換爲四字符數組然後使用該數組提取單個段是相對簡單的事情。當然,這是根據具有特定位寬度的數據類型來預測的,因此它不是便攜式的。

奇怪的是12-IP地址循環隊列。也許這樣可以一次獲得多達12個IP地址,而不會覆蓋字符串,儘管我認爲我從未遇到過超過兩個(可能是三個代理服務器或pass-thru服務器)的情況需要在同一時間。我不認爲這是線程安全的,因爲在線程環境中對which的修改本質上是危險的。

相關問題