2015-02-24 28 views
0

我试图用C++控制台创建一个基本的“登录”系统。使用PHP来确认用户信息,C++将简单地检索PHP文件输出的数据。读取文件时在线计算文件的字节数

我需要C++代码来在线读取文件末尾并停止。我正在使用的代码在文件末尾计算额外的字节数。

INT主要(){

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

你觉得'NumberOfBytesRead'存储? – 2015-02-24 01:07:18

回答

0

您实际读取的字节数在NumberOfBytesRead。因此,终止您的字符串,你只需要编写一个\0到该位置数组中:

DataReceived[NumberofBytesRead] = '\0'; 

所以,现在,它使读4096个字节,当然只能读取多达被送出。 NumberOfBytesRead告诉你实际上读取的字节数,而不是你请求的数字。

注意:根据具体情况,传输可能会被分成几块,因此即使数据是在单个“块”中发送的,也可能会在几次连续的读取尝试中收到。你可以读取(比如说)一个4字节的标题,告诉你其余的长度,并且知道继续阅读直到你收到整个事物(或者放弃,如果它花费太长时间)。