PHP& C ++检索用户IP

时间:2011-02-25 20:42:52

标签: php c++ http header ip

我有一个C ++控制台应用程序,它使用wininet.h来访问URL,并下载网页的内容。

内容通常只是一个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 ++程序读取它是完美的。

我也尝试将标题更改为plain / text和text / plain。结果相同。

感谢您的帮助!

编辑:这是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;
}

2 个答案:

答案 0 :(得分:1)

cout期望字符串以空值终止。因为您只是将字节读入缓冲区,而不是在结尾处将其终止,所以cout将继续执行您已读取的字节的结尾,并继续执行转储内存,直到它到达空指针或内存保护启动。

使用您的代码,正在发生的事情是猜测:

  1. 您指定一个16字节的内存区域。
  2. 您调用InternetReadFile。这会在您的缓冲区中放置一个IP地址,例如“127.0.0.1”,不带空终止符。
  3. 您使用DataReceived呼叫cout。这是一个char数组,因此cout期望它是一个以null结尾的字符串。它从缓冲区的开头输出每个字符,直到“127.0.01”之后,直到它在内存中找到0为止。
  4. 因为“127.0.0.1”只是要阅读,而你的缓冲区大于那个,所以下一次调用InternetReadFile会将NumberOfBytesRead保留为零,所以你的循环只发生一次。
  5. 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考虑到它们的工作原理,以及你需要做什么。

答案 1 :(得分: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
     }
?>