2013-12-22 21 views
0

對於我正在做的事情,我想獲得運行程序的PC的外部IP地址(用C語言編寫)。到目前爲止,我發現最好的方法是連接到一個只顯示訪問者IP的站點,然後解析IP的網頁。第一部分很簡單,但是當我顯示緩衝區時,我閱讀了頁面(它只能看到我的IP),在IP之後我會得到一些隨機的額外符號/字符。下面是我使用ATM代碼(簡化,以排除其他的東西):解析這個IP是正確的長度?

HINTERNET OpenInternet = NULL; 
HINTERNET GetIP = NULL; 
DWORD BytesRead = 0; 
char IPGrabbed[30]; 

OpenInternet = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); 
if (OpenInternet == NULL) { 
    return 1; 
} 

GetIP = InternetOpenUrl(OpenInternet, "http://api.externalip.net/ip/", NULL, 0, INTERNET_FLAG_RELOAD, 0); 
if (GetIP == NULL) 
    return 1; 

if (!InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed), &BytesRead)) 
    return 1; 

printf("IP: %s", IPGrabbed); 
getchar(); 

我也試圖通過IPGrabbed解析停止在任何「\ n」或「\ r」(因爲它顯示了怪異的人物當我printf()它下面的線IP),然後複製一切,直到有另一個字符數組,但得到了相同的結果。任何人都可以幫我弄清楚這裏發生了什麼?謝謝。

+0

請輸入和輸出樣本。 –

回答

0

初始化緩衝器到所有0秒,然後讀取一個字符少則緩衝器讀入提供。

這種方式0 -terminator C-「字符串」依賴隱含提供。

char IPGrabbed[30] = ""; /* Initialise the buffer to all `0`s ... */ 

[...] 

/* ... and then read one character less then the buffer to read into provides. */ 
if (!InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed) - 1, &BytesRead)) 
    return 1; 

fprintf(stderr, "IP: %s", IPGrabbed); /* Print to stderr, as it's not buffered so 
            everything appear immediately to the console. */ 
+0

謝謝,這已經解決了大部分問題,但現在在IP之後只顯示了很多空白字符。當我讀取char數組的strlen時,即使它不是那麼多,我也能得到14。有什麼方法可以找出這些IP後的空白字符是什麼?感謝您的回答,現在看起來很明顯。 –

+0

@RobLennon:你對他們有什麼期望,然後只是空白? – alk

+0

我真的在問我如何弄清楚這些字符是什麼,所以我可以在那裏截斷字符串,但我想到了我們的方式。我只是設置了一個遍歷IPGrabbed的每個字符的for循環,如果既不是數字又不是週期,它就知道IP真正結束的地方。謝謝。 –

0

InternetReadFile結果是不是空終止,則需要經過讀取成功空字符的代碼添加到字符串的結尾:

IPGrabbed[BytesRead] = 0; 

編輯1
正如建議如果被訪問的站點返回比IP字符串長的任何內容(最多16個字符),則上述代碼可能會遭遇緩衝區溢出錯誤。
建議將InternetReadFile更改爲讀取緩衝區長度的1以內,而不是緩衝區的全長,以消除上述問題。

InternetReadFile(GetIP, &IPGrabbed, sizeof(IPGrabbed)-1, &BytesRead) 
+1

如果'BytesRead == sizeof(IPGrabbed)'緩衝區溢出。 –

+0

@JonathanPotter,感謝您的提示,您的建議已被納入答案。 – nobody99