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 🙂 🙂 🙂


Anmelden zum Antworten