2013-03-08 3 views
0

Google에서이 코드를 발견했으며 다소 채택되었습니다. 문제가없는 한 그것까지. 그러나 빈 줄 시작 부분에 출력 파일이 많이 있습니다. 내가 어떻게 내릴 수 있는지 모르겠다.winapi로 데이터 가져 오기

나는 PHP에서 데이터를 가져 오려고합니다.

$echo "hello file"; 

그리고 빈 줄의 시작 부분에있는 파일에서 C++

int main() 
{ 

HINTERNET connect = InternetOpen("MyBrowser",0 ,0, 0, 0); 

    if(!connect){ 
     cout<<"Connection Failed or Syntax error"; 
     return 0; 
    } 


HINTERNET OpenAddress = InternetOpenUrl(connect, http://www.myurl.com/winapi.php", 0, 0, 0, 0); 

    if (!OpenAddress) 
    { 
     DWORD ErrorNum = GetLastError(); 
     cout<<"Failed to open URL \nError No: "<<ErrorNum; 
     InternetCloseHandle(connect); 
     return 0; 
    } 

    char DataReceived[4096]; 
    DWORD NumberOfBytesRead = 0; 
    ofstream data; 
    data.open("output.txt"); 

    while(InternetReadFile(OpenAddress, DataReceived, 4096, 
     &NumberOfBytesRead) && NumberOfBytesRead) {   
     DataReceived[NumberOfBytesRead]='\x00'; 
     data<< DataReceived;  
} 


    system("pause"); 
} 

너무 많이이다. 어떻게 제거합니까?

답변

0

InternetReadFile()이 실제로 4096 바이트를 읽으면 버퍼 오버 플로우가 발생합니다. 당신은 실제로 << 연산자 대신 write() 방법을 사용하여 읽은 바이트 수까지 그대로 단지 버퍼를 쓰기 버퍼를 NULL로 종료 할 필요가 없습니다, 그렇게 말

int main() 
{ 
    HINTERNET connect = InternetOpen("MyBrowser",0 ,0, 0, 0); 
    if (!connect) 
    { 
     cout << "Connection Failed or Syntax error"; 
     return 0; 
    } 

    HINTERNET OpenAddress = InternetOpenUrl(connect, "http://www.myurl.com/winapi.php", 0, 0, 0, 0); 
    if (!OpenAddress) 
    { 
     DWORD ErrorNum = GetLastError(); 
     cout << "Failed to open URL" << endl << " Error No: " << ErrorNum; 
     InternetCloseHandle(connect); 
     return 0; 
    } 

    ofstream data("output.txt"); 
    if (!data) 
    { 
     cout << "Failed to open txt file"; 
     InternetCloseHandle(OpenAddress); 
     InternetCloseHandle(connect); 
     return 0; 
    } 

    char DataReceived[4096]; 
    DWORD NumberOfBytesRead = 0; 

    do 
    { 
     if (!InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead)) 
     { 
      DWORD ErrorNum = GetLastError(); 
      cout << "Failed to read from URL" << endl << " Error No: " << ErrorNum; 
      InternetCloseHandle(OpenAddress); 
      InternetCloseHandle(connect); 
      return 0; 
     } 

     if (NumberOfBytesRead == 0) 
      break; 

     data.write(DataReceived, NumberOfBytesRead);  
    } 
    while (true); 

    cout << "Finished reading from URL"; 
    system("pause"); 

    return 0; 
} 

당신이 경우 여분의 줄이 여전히 파일에 나타나면 패킷 스니퍼를 사용하여 실제로 PHP에서 전송중인 데이터를 확인하고 여분의 빈 줄을 보내지 않도록하십시오. 그렇다면 클라이언트 쪽이 아니라 PHP 쪽에서 문제를 해결해야합니다.