我有一个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;
}
答案 0 :(得分:1)
cout
期望字符串以空值终止。因为您只是将字节读入缓冲区,而不是在结尾处将其终止,所以cout
将继续执行您已读取的字节的结尾,并继续执行转储内存,直到它到达空指针或内存保护启动。
使用您的代码,正在发生的事情是猜测:
cout
。这是一个char数组,因此cout
期望它是一个以null结尾的字符串。它从缓冲区的开头输出每个字符,直到“127.0.01”之后,直到它在内存中找到0为止。对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
}
?>