我正在尝试使用C ++控制台创建一个基本的“登录”系统。使用PHP确认用户信息,C ++将只检索PHP文件输出的数据。
我需要C ++代码在线读取文件的末尾并停止。我正在使用的代码在文件末尾计算额外的字节。
int main(){
HINTERNET connect = InternetOpenA("LoginCheckUserAgent 0.0.1v (compatible; harmless;)", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (!connect){
cout << "Connection Failed or Syntax error";
return 0;
}
HINTERNET OpenAddress = InternetOpenUrlA(connect, "http://localhost/login/check.php?username=admin&password=admin", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_KEEP_CONNECTION, 0);
if (!OpenAddress)
{
DWORD ErrorNum = GetLastError();
cout << "Failed to open URL \nError No: " << ErrorNum;
InternetCloseHandle(connect);
return 0;
}
char DataReceived[4096];
DWORD NumberOfBytesRead = 0;
while (InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead)
{
cout << DataReceived;
}
InternetCloseHandle(OpenAddress);
InternetCloseHandle(connect);
cin.get();
return 0;
}
上面的代码给了我:abc123 |||||||||||等..(直到它达到4096字节) 我希望它能给我:abc123 我需要完全阅读“http://localhost/login/check.php?username=admin&password=admin”的内容而不需要额外的字节。我提供的代码尝试读取4096字节。
我知道我可以将4096设置为1或者其他东西,并且仅使用PHP来回复1个字节。但是我想让PHP脚本响应数据,这些数据总是在变化,所以我不能只假设我要处理的字节数。
我不需要任何人修复代码,我只想知道如何确定我将要读取的字节,然后让我的脚本将其读取到这些字节的末尾。所以我没有得到不必要的字节。
抱歉,如果我弄得一团糟。
答案 0 :(得分:0)
您实际阅读的字节数在NumberOfBytesRead
。因此,要终止字符串,只需要将\0
写入数组中的该位置:
DataReceived[NumberofBytesRead] = '\0';
现在,它正在使 room 读取4096字节,但当然只能读取发送的数量。 NumberOfBytesRead
告诉您实际读取的字节数,而不是您请求的数字。
注意:根据具体情况,传输可能会分解成碎片,因此即使数据是在单个“块”中发送的,也可能会在几次连续读取尝试中收到。
通常你想要为你的数据加上它的长度前缀,所以你可以读(比方说)一个4字节的标题,告诉你余数的长度,并知道继续阅读,直到你收到整个事情(或给起来,比如如果花了太长时间。)