2011-02-25 52 views
0

我有一個C++控制檯應用程序,它使用wininet.h來訪問URL並下載網頁的內容。PHP和C++檢索用戶IP

內容通常只是一個IP地址。它在這裏:http://www.whatismyip.com/automation/n09230945.asp

一切都很好。

然後,我決定在PHP中創建我自己的IP檢查,使用下面的代碼:

<?php 

$ip = $_SERVER['REMOTE_ADDR']; 

header("Cache-Control: private"); 
header("Content-Type: text/html"); 

echo $ip; 

?> 

這看起來是正確的在瀏覽器中,相同的whatismyip.com的結果,但C++程序只是增加了一堆垃圾IP後,然後重複IP一半切斷,然後添加更多的垃圾。

這是什麼造成的?我試着分析標題,但我無法找到差異。

此外,我試圖把一個普通的txt文件放到服務器上,並且C++程序讀取它是完美的。

我也嘗試將我的標題更改爲純文本和文本/純文本。同樣的結果。

謝謝你的幫助!

編輯:這裏的C++代碼的一部分:

HINTERNET OpenAddress = InternetOpenUrl(connect,"http://www...", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0); 

char DataReceived[16] = " "; 
DWORD NumberOfBytesRead = 0; 
while (InternetReadFile(OpenAddress, DataReceived, 16, &NumberOfBytesRead) &&  NumberOfBytesRead) 
{ 
    cout << DataReceived; 
} 
+1

你可以發佈一個你回來的內容的例子嗎? – ircmaxell 2011-02-25 20:47:59

+3

我相信你的問題不在PHP中,而是在這個C++程序中。聽起來像你正在讀更遠的緩衝區,而不是你需要的。正如所發送的IP地址只有這麼長時間,你的緩衝區可能比這個長,你正在讀整個緩衝區。 – Brad 2011-02-25 20:50:14

+0

它們通常是隨機的非標準字符。無論讀取什麼都存儲在char [16]中。我不明白爲什麼它完美地與其他服務協同工作,但不是我的。 – djdy 2011-02-25 20:55:04

回答

1

cout將期望的字符串是空終止。因爲你只是將字節讀入一個緩衝區,並且不會在最後終止它們,所以cout將繼續讀取所讀取字節的結尾,並且只是將內存轉儲出去,直到它達到空指針或內存在

與您的代碼保護踢,發生的事情是這樣的,在一個猜測:

  1. 你分配的內存的16字節區域。
  2. 您可以調用InternetReadFile。這會在您的緩衝區中放置一個IP地址,例如「127.0.0.1」,而不會有空終止符。使用DataReceived調用cout。這是一個char數組,因此cout期望它是一個以空字符結尾的字符串。它從緩衝區的起始處輸出每個字符,從「127.0.01」開始直到它在內存中找到0。
  3. 由於「127.0.0.1」全部讀取,並且您的緩衝區大於此值,下一次對InternetReadFile的調用將NumberOfBytesRead保留爲零,因此您的循環只發生一次。

不知道InternetReadFile()什麼,但我猜這樣的做法應該工作,如果你只抓住一條線,在它的IP地址:

char DataReceived[64]; // I guess I'm antsy about having plenty of room 

DWORD NumberOfBytesRead = 0; 
if (InternetReadFile(OpenAddress, DataReceived, 63, &NumberOfBytesRead)) { 
    DataReceived[NumberOfBytesRead] = '\0'; 
    cout << DataReceived; 
} else // handle error condition 

但從根本,我認爲你遇到的主要問題是將一個只有一堆字節的緩衝區與一個友好的以null結尾的字符串混淆起來,你應該理解這一點,並且可能尋找一些使用InternetReadFile的現有示例看看他們是如何工作的,因此你需要做什麼。

+0

這工作完美!謝謝! – djdy 2011-02-25 21:26:27

1
<?PHP 
$ip = $_SERVER['REMOTE_ADDR']; //Checks internet remote adderater, 
$fh = "YourSecretFileHere.txt"; //Starts a socket in w_temppTXT, aka the .txt 
fwrite($fh, 'IP Address:'.'$ip'); //Writes Info From IP into File, 
fclose($fh); //Closes file, ends writing boot comp. 
if $fh = ""; { //If the file is empty, 
echo "IP File Is Empty!"; //Echo's From Above^
else { 
echo ""; //Prints nothing from variables 
    } 
?>