2012-02-20 5 views
0

나는 C++에서별로 좋지 않다. 코드 조각에서 뭔가 더 잘 될 수 있다면 나에게 교육 시켜라!WinHTTP 비동기 콜백

저는 비동기식으로 winhttp를 구현하고 있습니다. 하지만 인스턴트 메시지를받는 데 문제가 있습니다. 나는 그것을 이해할 수 없다. 왜냐하면 당신은 한 번에 전체 응답을 parsethe 수 있어야합니다. 여러 동시 요청이 발생할 수 있기 때문에 전역 변수에 응답 (헤더 + 본문)을 버퍼링하는 것은 길이 아닙니다.

http get 요청의 응답을 검색하려면 어떻게해야합니까? 아니면, 그것은 새로운 스레드에서 WinHTTP에 동기를 실행하는 것이 좋습니다 (그래서 메인 루프는 아무튼; t 차단 얻을하고 수행하는 함수를 호출?) :

 void __stdcall cb(HINTERNET h, DWORD_PTR d, DWORD dwInternetStatus, LPVOID lpvStatusInformation, DWORD dwStatusInformationLength){ 
     char* s=new char[1]; 

      DWORD dwSize = 0; 
      if (dwInternetStatus==WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE){ 
           MessageBoxA(0,s,"",0); 

       WinHttpQueryDataAvailable(h, &dwSize); 
       ..... 

      } 

} 

그리고 메인에서 호출 :

...winhttpopen... 
WinHttpSetStatusCallback(request, (WINHTTP_STATUS_CALLBACK)whCallback,WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,0); 
...winhttpsend.... 

답변

4

MSDN에서이 샘플 코드를 확인하십시오 - Asynchronous Completion in WinHTTP.

QueryData에 WinHttpQueryDataAvailable 호출이 dwInternetStatus 파라미터에 WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE 완료와 지위 콜백을 생성한다. 이 가리키는 값을 lpvStatusInformation 매개 변수로 확인하면 데이터가 얼마나 남았는지를 결정할 수 있고 나머지 데이터가없는 경우 은 읽을 수있는 모든 데이터를 표시 할 수 있습니다.

이것은 버퍼 포인터와 데이터 길이로 콜백이 호출되었음을 보여줍니다.

+0

winhttp에 대한 경험이 있고 손을 들려 줄 수있는 사람 :-) http://stackoverflow.com/questions/11577503/winhttp-used-in-async-mode-error-internet-cannot-connect-how-to -cleanly-close – Ghita

+0

비동기 콜백을 제외하고 ** WinHTTP ** 문서의 ** 비동기 완료가 모든 것을 보여주는 방법은 재미 있습니다. –