• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            huyutian

            他強由他強,清風拂山崗;他橫由他橫,明月照大江。他自狠來他自惡,我自一口真氣足

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              20 隨筆 :: 47 文章 :: 22 評論 :: 0 Trackbacks

            關于WinInet的異步模式,微軟給過很多例子,但我覺得下面這個是比較好理解的。
            原文地址,代碼貼出來,有些細節部分還要自己慢慢體會。
            我在調試過程中,還參照了以下一些鏈接
            關于GetLastError返回1201(ERROR_INTERNET_INCORRECT_HANDLE_STATE)9錯誤的解決辦法請參見下面兩個鏈接
            http://support.genopro.com/Topic14017-59-1.aspx
            http://support.microsoft.com/kb/177190
            這是微軟wininet的一個bug,僅當大 POST請求包要發送時,使用 HttpSendRequestEx。其他時候使用HttpSendRequest。防止12019錯誤

            WinInet 錯誤代碼可參照這里 http://support.microsoft.com/kb/193625

              1#include<windows.h>
              2#include<wininet.h>
              3#include<iostream.h>
              4
              5HANDLE hConnectedEvent, hRequestOpenedEvent, hRequestCompleteEvent;
              6HINTERNET hInstance, hConnect, hRequest;
              7char *lpszUrl, *lpszServer;
              8
              9BOOL bAllDone = FALSE;
             10BOOL bVerbose = FALSE;
             11
             12void __stdcall Callback(HINTERNET hInternet,
             13              DWORD dwContext,
             14              DWORD dwInternetStatus,
             15              LPVOID lpStatusInfo,
             16              DWORD dwStatusInfoLen);
             17
             18void main(int argc, char *argv[])
             19{
             20    if (argc != 3)
             21    {
             22        if ((argc == 4&& (argv[3][0== 'v'))
             23            bVerbose = TRUE;
             24        else
             25        {
             26            cout << "Usage: asynchttp <server> <url> [v]" << endl;
             27            cout << "   <server> is the hostname of the http server" << endl;
             28            cout << "   <url> is the url of the object you are requesting (without the hostname)" << endl;
             29            cout << "   'v' for verbose output" << endl << endl;
             30            cout << "   Example: asynchttp www.domain.com /docs/readme.htm v" << endl;
             31            return;
             32        }

             33    }

             34
             35    lpszServer = argv[1];
             36    lpszUrl = argv[2];
             37
             38    hConnectedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
             39    hRequestOpenedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
             40    hRequestCompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
             41
             42    hInstance = InternetOpen("asynchttp"
             43                             INTERNET_OPEN_TYPE_PRECONFIG,
             44                             NULL,
             45                             NULL,
             46                             INTERNET_FLAG_ASYNC); // ASYNC Flag
             47
             48    if (hInstance == NULL)
             49    {
             50        cout << "InternetOpen failed, error " << GetLastError();
             51        return;
             52    }

             53
             54    // Setup callback function
             55    if (InternetSetStatusCallback(hInstance,
             56                                  (INTERNET_STATUS_CALLBACK)&Callback) == INTERNET_INVALID_STATUS_CALLBACK)
             57    {
             58        cout << "InternetSetStatusCallback failed, error " << GetLastError();
             59        return;
             60    }

             61
             62    // First call that will actually complete asynchronously even
             63    // though there is no network traffic
             64    hConnect = InternetConnect(hInstance, 
             65                               lpszServer, 
             66                               INTERNET_DEFAULT_HTTP_PORT,
             67                               NULL,
             68                               NULL,
             69                               INTERNET_SERVICE_HTTP,
             70                               0,
             71                               1); // Connection handle's Context
             72    if (hConnect == NULL)
             73    {
             74        if (GetLastError() != ERROR_IO_PENDING)
             75        {
             76            cout << "InternetConnect failed, error " << GetLastError();
             77            return;
             78        }

             79        // Wait until we get the connection handle
             80        WaitForSingleObject(hConnectedEvent, INFINITE);
             81    }

             82
             83
             84    // Open the request
             85    hRequest = HttpOpenRequest(hConnect, 
             86                               "GET"
             87                               lpszUrl,
             88                               NULL,
             89                               NULL,
             90                               NULL,
             91                               INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE,
             92                               2);  // Request handle's context 
             93    if (hRequest == NULL)
             94    {
             95        if (GetLastError() != ERROR_IO_PENDING)
             96        {
             97            cout << "HttpOpenRequest failed, error " << GetLastError();
             98            return;
             99        }

            100        // Wait until we get the request handle
            101        WaitForSingleObject(hRequestOpenedEvent, INFINITE);
            102    }

            103
            104    if (!HttpSendRequest(hRequest, 
            105                         NULL, 
            106                         0
            107                         NULL,
            108                         0))
            109    {
            110        if (GetLastError() != ERROR_IO_PENDING)
            111        {
            112            cout << "HttpSendRequest failed, error " << GetLastError();
            113            return;
            114        }

            115    }

            116    
            117    if (bVerbose)
            118    {
            119        cout << "HttpSendRequest called successfully" << endl;
            120        cout.flush();
            121    }

            122
            123    WaitForSingleObject(hRequestCompleteEvent, INFINITE);
            124
            125    cout << "------------------- Read the response -------------------" << endl;
            126    char lpReadBuff[256];
            127
            128    do
            129    {
            130        INTERNET_BUFFERS InetBuff;
            131        FillMemory(&InetBuff, sizeof(InetBuff), 0);
            132        InetBuff.dwStructSize = sizeof(InetBuff);
            133        InetBuff.lpvBuffer = lpReadBuff;
            134        InetBuff.dwBufferLength = sizeof(lpReadBuff) - 1;
            135        
            136        if (bVerbose)
            137        {
            138            cout << "Calling InternetReadFileEx" << endl;
            139            cout.flush();
            140        }

            141
            142        if (!InternetReadFileEx(hRequest,
            143                              &InetBuff,
            144                              02))
            145        {
            146            if (GetLastError() == ERROR_IO_PENDING)
            147            {
            148                if (bVerbose)
            149                {
            150                    cout << "Waiting for InternetReadFileEx to complete" << endl;
            151                    cout.flush();
            152                }

            153                WaitForSingleObject(hRequestCompleteEvent, INFINITE);
            154            }

            155            else
            156            {
            157                cout << "InternetReadFileEx failed, error " << GetLastError();
            158                cout.flush();
            159                return;
            160            }

            161        }

            162
            163        lpReadBuff[InetBuff.dwBufferLength] = 0;
            164        cout << lpReadBuff;
            165        cout.flush();
            166
            167        if (InetBuff.dwBufferLength == 0
            168            bAllDone = TRUE;
            169
            170    }
             while (bAllDone == FALSE);
            171
            172    cout << endl << endl << "------------------- Request Complete ----------------" << endl;
            173
            174}

            175
            176void __stdcall Callback(HINTERNET hInternet,
            177              DWORD dwContext,
            178              DWORD dwInternetStatus,
            179              LPVOID lpStatusInfo,
            180              DWORD dwStatusInfoLen)
            181{
            182    if (bVerbose)
            183    {
            184        cout << "Callback dwInternetStatus: " << dwInternetStatus << " Context: " << dwContext << endl;
            185        cout.flush();
            186    }

            187
            188    switch(dwContext)
            189    {
            190    case 1// Connection handle
            191        if (dwInternetStatus == INTERNET_STATUS_HANDLE_CREATED)
            192        {
            193            INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
            194            hConnect = (HINTERNET)pRes->dwResult;
            195            if (bVerbose)
            196            {
            197                cout << "Connect handle created" << endl;
            198                cout.flush();
            199            }

            200            SetEvent(hConnectedEvent);
            201        }

            202        break;
            203    case 2// Request handle
            204        switch(dwInternetStatus)
            205        {
            206        case INTERNET_STATUS_HANDLE_CREATED:
            207            {
            208                INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
            209                hRequest = (HINTERNET)pRes->dwResult;
            210                if (bVerbose)
            211                {
            212                    cout << "Request handle created" << endl;
            213                    cout.flush();
            214                }

            215                SetEvent(hRequestOpenedEvent);
            216            }

            217            break;
            218        case INTERNET_STATUS_REQUEST_SENT:
            219            {
            220                DWORD *lpBytesSent = (DWORD*)lpStatusInfo;
            221                if (bVerbose)
            222                {
            223                    cout << "Bytes Sent: " << *lpBytesSent << endl;
            224                    cout.flush();
            225                }

            226            }

            227            break;
            228        case INTERNET_STATUS_REQUEST_COMPLETE:
            229            {
            230                INTERNET_ASYNC_RESULT *pAsyncRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
            231                if (bVerbose)
            232                {
            233                    cout << "Function call finished" << endl;
            234                    cout << "dwResult: " << pAsyncRes->dwResult << endl;
            235                    cout << "dwError:  " << pAsyncRes->dwError << endl;
            236                    cout.flush();
            237                }

            238                SetEvent(hRequestCompleteEvent);
            239            }

            240            break;
            241        case INTERNET_STATUS_RECEIVING_RESPONSE:
            242            if (bVerbose)
            243            {
            244                cout << "Receiving Response" << endl;
            245                cout.flush();
            246            }

            247            break;
            248        case INTERNET_STATUS_RESPONSE_RECEIVED:
            249            {
            250                DWORD *dwBytesReceived = (DWORD*)lpStatusInfo;
            251                if (*dwBytesReceived == 0)
            252                    bAllDone = TRUE;
            253                if (bVerbose)
            254                {
            255                    cout << "Received " << *dwBytesReceived << endl;
            256                    cout.flush();
            257                }

            258            }

            259
            260        }

            261
            262    }

            263
            264}

            265
            posted on 2010-08-10 22:52 胡雨田 閱讀(5441) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程
            久久99热狠狠色精品一区| 久久精品亚洲日本波多野结衣| 久久99国产综合精品| 久久精品国产网红主播| 99久久婷婷国产综合精品草原| 94久久国产乱子伦精品免费| 人妻无码αv中文字幕久久琪琪布| 久久精品国产亚洲AV嫖农村妇女| 香蕉99久久国产综合精品宅男自 | 国产成人久久精品区一区二区| 欧美伊香蕉久久综合类网站| 久久亚洲熟女cc98cm| 国内精品久久久久久野外| 国产精品99久久久精品无码| 国产午夜久久影院| 色综合久久无码中文字幕| 国产69精品久久久久观看软件 | 久久久久亚洲AV成人网人人网站| 日产精品久久久一区二区| 色偷偷88欧美精品久久久| 麻豆精品久久久一区二区| 激情伊人五月天久久综合 | 久久免费视频网站| 亚洲人成伊人成综合网久久久| 亚洲国产精品婷婷久久| 熟妇人妻久久中文字幕| 亚洲中文字幕无码久久精品1 | 亚洲综合久久夜AV | 国产精品18久久久久久vr| 午夜精品久久久内射近拍高清| www亚洲欲色成人久久精品| 国产国产成人精品久久| 97r久久精品国产99国产精| 久久不见久久见免费视频7| 久久久久亚洲AV无码网站| 久久午夜无码鲁丝片| 久久精品国产亚洲AV无码娇色| 91精品国产高清91久久久久久| 精品国产福利久久久| 精品久久国产一区二区三区香蕉| 国产精品免费久久久久电影网|