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

            他強(qiáng)由他強(qiáng),清風(fēng)拂山崗;他橫由他橫,明月照大江。他自狠來(lái)他自惡,我自一口真氣足

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              20 隨筆 :: 47 文章 :: 22 評(píng)論 :: 0 Trackbacks

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

            WinInet 錯(cuò)誤代碼可參照這里 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 胡雨田 閱讀(5440) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 網(wǎng)絡(luò)編程
            久久99国产精品久久久| 精品国产乱码久久久久久郑州公司| 国产亚洲精久久久久久无码AV| 91精品国产91久久综合| 国产一区二区精品久久| 亚洲国产精品久久久久久| 久久99精品久久久久久齐齐| 无码任你躁久久久久久久| 久久久久久久精品成人热色戒| 亚洲精品国产字幕久久不卡| 精品久久久久香蕉网| 精品久久国产一区二区三区香蕉| 色播久久人人爽人人爽人人片aV | 日韩AV无码久久一区二区| 国产情侣久久久久aⅴ免费| 国产成人无码精品久久久免费| 久久青青草原精品国产软件| 漂亮人妻被中出中文字幕久久| 久久精品国产亚洲AV香蕉| 国产激情久久久久影院| 思思久久好好热精品国产| 久久精品99久久香蕉国产色戒| 国产高清美女一级a毛片久久w| 少妇无套内谢久久久久| 久久99国产精品99久久| 久久婷婷午色综合夜啪| 国产成人久久激情91| 色诱久久av| 久久国产免费观看精品| 久久精品卫校国产小美女| 亚洲国产精品人久久| 18禁黄久久久AAA片| 国产国产成人久久精品| 天天爽天天狠久久久综合麻豆| 久久99国产精品成人欧美| 久久夜色精品国产噜噜噜亚洲AV| 韩国三级中文字幕hd久久精品 | 国产精品九九久久免费视频 | 国内精品久久久久久麻豆| 色婷婷综合久久久久中文| 无码国内精品久久人妻麻豆按摩 |