【问题标题】:PHP & C++ Retrieving user IPPHP & C++ 检索用户 IP
【发布时间】:2011-07-04 14:09:26
【问题描述】:

我有一个 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++ 程序读取它完美。

我还尝试将标题更改为纯文本和文本/纯文本。结果一样。

感谢您的帮助!

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

【问题讨论】:

  • 你能发布一个你得到的内容的例子吗?
  • 我确信您的问题不在于 PHP,而在于这个 C++ 程序。在我看来,您正在阅读比您需要的缓冲区更远的内容。例如,发送的 IP 地址只会很长,您的缓冲区可能比这更长,而您正在读取整个缓冲区。
  • 它们通常是随机的非标准字符。读取的任何内容都存储在 char [16] 中。我不明白为什么它可以完美地与其他服务一起使用,但不是我的。

标签: php c++ http header ip


【解决方案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 保留为零,因此您的循环只发生一次。

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

但从根本上说,我认为您遇到的主要问题是将只是一堆字节的缓冲区与一个友好的以空字符结尾的字符串混淆,您应该理解这一点,也许可以寻找一些现有的使用示例InternetReadFile 记住这一点,看看它们是如何工作的,因此你需要做什么。

【讨论】:

    【解决方案2】:
    <?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
         }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2019-04-22
      • 2018-06-07
      • 2010-11-25
      • 2018-08-21
      相关资源
      最近更新 更多