WinHttp receive INCORRECT_HANDLE_STATE
-
Hallo, ich habe mir mit WinHttp einen HTTP-Clienten zusammengebastelt, im Gegensatz zu Früher bekomme ich aber eine Fehlermeldung: ERROR_WINHTTP_INCORRECT_HANDLE_STATE (12019)
Die Fehlermeldung kommt ganz am Ende der fReceiveFile()-Funktion bei "if(!frf_bResults) cout<<"Error = \a"<<GetLastError();"
Hier der ausgeschnittene Kode. Danke für die Mühe.
string fReceiveFile(BOOL, HINTERNET, DWORD, DWORD); int main() { DWORD dwKopie = 0, dwStatusCode = 0, dwSize = 0, dwDownloaded = 0; LPCWSTR lpcwstr_server, lpcwstr_link, lpcwstr_kopie; LPVOID lpBuffer; BOOL bResults = FALSE; HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL; hSession = WinHttpOpen(UserAgent, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); if(!hSession){ cout<<endl<<"Error WinHttpOpen(); = \a"<<GetLastError(); Sleep(2000); return 0; } hConnect = WinHttpConnect(hSession, lpcwstr_server, 80, 0); if(!hConnect){ cout<<endl<<"Error WinHttpConnect(); = \a"<<GetLastError(); WinHttpCloseHandle(hSession); Sleep(2000); return 0; } hRequest = WinHttpOpenRequest(hConnect, L"GET", lpcwstr_link, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH); if(!hRequest){ cout<<endl<<"Error WinHttpOpenRequest(); = \a"<<GetLastError(); WinHttpCloseHandle(hSession); WinHttpCloseHandle(hConnect); Sleep(2000); return 0; } bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); bResults = WinHttpReceiveResponse(hRequest, NULL); //Statuscode Auslesen dwKopie = sizeof(dwStatusCode); WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, WINHTTP_HEADER_NAME_BY_INDEX, &dwStatusCode, &dwKopie, WINHTTP_NO_HEADER_INDEX); //Header Auslesen LPVOID lpOutBuffer = NULL; // First, use WinHttpQueryHeaders to obtain the size of the buffer. if(bResults) { WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, NULL, &dwSize, WINHTTP_NO_HEADER_INDEX); // Allocate memory for the buffer. if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) { lpOutBuffer = new WCHAR[dwSize/sizeof(WCHAR)]; // Now, use WinHttpQueryHeaders to retrieve the header. bResults = WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_RAW_HEADERS_CRLF, WINHTTP_HEADER_NAME_BY_INDEX, lpOutBuffer, &dwSize, WINHTTP_NO_HEADER_INDEX); } } // Free the allocated memory. delete [] lpOutBuffer; strEingang = fReceiveFile(bResults, hRequest, dwSize, dwDownloaded); WinHttpCloseHandle(hRequest); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hSession); return 0; } //Hier am Ende kommt der Fehler string fReceiveFile(BOOL frf_bResults, HINTERNET frf_hRequest, DWORD frf_dwSize, DWORD frf_dwDownloaded) { string str2 = ""; LPSTR frf_pOutBuffer; if(frf_bResults) do{ // Check for available data. frf_dwSize = 0; frf_dwDownloaded = 0; if(!WinHttpQueryDataAvailable(frf_hRequest, &frf_dwSize)) cout<<"Error WinHttpQueryDataAvailable(); = \a"<<GetLastError(); // Allocate space for the buffer. frf_pOutBuffer = new char[frf_dwSize+1]; if(!frf_pOutBuffer) { cout<<endl<<"Out of memory\a"<<endl; frf_dwSize=0; } else { // Read the Data. ZeroMemory(frf_pOutBuffer, frf_dwSize+1); if(!WinHttpReadData(frf_hRequest, (LPVOID)frf_pOutBuffer, frf_dwSize, &frf_dwDownloaded)) cout<<"Error WinHttpReadData(); = \a"<<GetLastError(); else str2 = str2 + frf_pOutBuffer; // Free the memory allocated to the buffer. delete [] frf_pOutBuffer; } } while(frf_dwSize > 0); // Report any errors. if(!frf_bResults) cout<<"Error = \a"<<GetLastError(); return str2; }
-
Gast123123 schrieb:
bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); bResults = WinHttpReceiveResponse(hRequest, NULL);
Du schaust Dir den Rückgabewert von WinHttpSendRequest nicht weiter an. Wenn bereits diese Funktion fehlschlägt, ist das Handle nämlich tatsächlich in einem "Invalid State" für WinHttpReceiveResponse.
-
Mox schrieb:
Gast123123 schrieb:
bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0); bResults = WinHttpReceiveResponse(hRequest, NULL);
Du schaust Dir den Rückgabewert von WinHttpSendRequest nicht weiter an. Wenn bereits diese Funktion fehlschlägt, ist das Handle nämlich tatsächlich in einem "Invalid State" für WinHttpReceiveResponse.
Ja richtig.
WinHttpSendRequest(); liefert den Fehler 12007 ERROR_WINHTTP_NAME_NOT_RESOLVED. Bin noch am experimentieren woran es liegt.
-
Gast123123 schrieb:
WinHttpSendRequest(); liefert den Fehler 12007 ERROR_WINHTTP_NAME_NOT_RESOLVED. Bin noch am experimentieren woran es liegt.
Das liegt an Parameter 2 in Deinem Aufruf von WinHttpConnect. Du hast ganz einfach eine falsche Adresse angegeben.
-
Okay, hat sich erledigt. cin.ignore(); vor getline hatte das erste Zeichem im String entfernt ^^
-
Mox schrieb:
Gast123123 schrieb:
WinHttpSendRequest(); liefert den Fehler 12007 ERROR_WINHTTP_NAME_NOT_RESOLVED. Bin noch am experimentieren woran es liegt.
Das liegt an Parameter 2 in Deinem Aufruf von WinHttpConnect. Du hast ganz einfach eine falsche Adresse angegeben.
Trotzdem vielen dank