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

            Benjamin

            靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠。
            隨筆 - 397, 文章 - 0, 評論 - 196, 引用 - 0
            數(shù)據(jù)加載中……

            WinInet編程中連接超時的解決方法

            在WinInet編程中,SetOption函數(shù)用來設置超時,可經(jīng)過測試,無效。在MSDN文檔中明確指出“InternetSetOption Does Not Set Timeout Values”,微軟提出的解決方法是用線程來實現(xiàn),示例代碼如下:
              1 #include <windows.h>
              2    #include <wininet.h>
              3    #include <iostream.h>
              4 
              5    DWORD WINAPI WorkerFunction( LPVOID ); 
              6    HINTERNET g_hOpen, g_hConnect;
              7 
              8    typedef struct 
              9    {
             10        CHAR* pHost;
             11        CHAR* pUser;
             12        CHAR* pPass;
             13    } PARM;
             14 
             15    void main()
             16    {
             17        CHAR    szHost[] = "localhost";
             18        CHAR    szUser[] = "JoeB";
             19        CHAR    szPass[] = "test";
             20        CHAR    szLocalFile[] = "localfile";
             21        CHAR    szRemoteFile[] = "remotefile";
             22        DWORD   dwExitCode;
             23        DWORD   dwTimeout;
             24        PARM    threadParm;
             25 
             26        g_hOpen = 0;
             27        if ( !( g_hOpen = InternetOpen ( "FTP sample"
             28                                         LOCAL_INTERNET_ACCESS, 
             29                                         NULL, 
             30                                         0
             31                                         0 ) ) )
             32        {         
             33            cerr << "Error on InternetOpen: " << GetLastError() << endl;
             34            return ;
             35        }
             36 
             37        // Create a worker thread 
             38        HANDLE   hThread; 
             39        DWORD    dwThreadID;
             40        threadParm.pHost = szHost;
             41        threadParm.pUser = szUser;
             42        threadParm.pPass = szPass;
             43 
             44        hThread = CreateThread(
             45                      NULL,            // Pointer to thread security attributes 
             46                      0,               // Initial thread stack size, in bytes 
             47                      WorkerFunction,  // Pointer to thread function 
             48                      &threadParm,     // The argument for the new thread
             49                      0,               // Creation flags 
             50                      &dwThreadID      // Pointer to returned thread identifier 
             51                  );    
             52 
             53        // Wait for the call to InternetConnect in worker function to complete
             54        dwTimeout = 5000// in milliseconds
             55        if ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
             56        {
             57            cout << "Can not connect to server in " 
             58                 << dwTimeout << " milliseconds" << endl;
             59            if ( g_hOpen )
             60    InternetCloseHandle ( g_hOpen );
             61            // Wait until the worker thread exits
             62            WaitForSingleObject ( hThread, INFINITE );
             63            cout << "Thread has exited" << endl;
             64            return ;
             65        }
             66     
             67        // The state of the specified object (thread) is signaled
             68        dwExitCode = 0;
             69        if ( !GetExitCodeThread( hThread, &dwExitCode ) )
             70        {
             71            cerr << "Error on GetExitCodeThread: " << GetLastError() << endl;
             72            return ;
             73        }
             74 
             75        CloseHandle (hThread);
             76        if ( dwExitCode )
             77        // Worker function failed
             78           return ;
             79     
             80        if ( !FtpGetFile ( g_hConnect, 
             81                           szRemoteFile,
             82                           szLocalFile,
             83                           FALSE,INTERNET_FLAG_RELOAD, 
             84                           FTP_TRANSFER_TYPE_ASCII,
             85                           0 ) )
             86        {
             87            cerr << "Error on FtpGetFile: " << GetLastError() << endl;
             88            return ;
             89        }
             90 
             91        if ( g_hConnect )
             92            InternetCloseHandle( g_hConnect );
             93        if ( g_hOpen )
             94            InternetCloseHandle( g_hOpen );
             95 
             96        return ;
             97    }
             98 
             99    /////////////////// WorkerFunction /////////////////////
            100    DWORD WINAPI 
            101    WorkerFunction(
            102        IN LPVOID vThreadParm
            103    )
            104    /*
            105    Purpose:
            106        Call InternetConnect to establish a FTP session  
            107    Arguments:
            108        vThreadParm - points to PARM passed to thread
            109    Returns:
            110        returns 0  
            111    */ 
            112    {
            113        PARM* pThreadParm;
            114        // Initialize local pointer to void pointer passed to thread
            115        pThreadParm = (PARM*)vThreadParm;
            116        g_hConnect = 0;
            117     
            118        if ( !( g_hConnect = InternetConnect (
            119                                 g_hOpen, 
            120                                 pThreadParm->pHost,
            121                                 INTERNET_INVALID_PORT_NUMBER,
            122                                 pThreadParm->pUser,
            123 pThreadParm->pPass,
            124                                 INTERNET_SERVICE_FTP, 
            125                                 0,
            126                                 0 ) ) )
            127        {
            128            cerr << "Error on InternetConnnect: " << GetLastError() << endl;
            129            return 1// failure
            130        }
            131        
            132        return 0;  // success
            133    }
            134 

            一個老外寫的同步類
            W3C  w3csample

            posted on 2009-05-17 16:17 Benjamin 閱讀(5947) 評論(0)  編輯 收藏 引用 所屬分類: VC

            久久综合狠狠综合久久97色| 手机看片久久高清国产日韩| 久久久高清免费视频| 婷婷久久五月天| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久午夜无码鲁丝片秋霞| yy6080久久| 久久免费小视频| 久久经典免费视频| 久久久久久综合一区中文字幕| 久久99精品久久久久久9蜜桃 | 无码国产69精品久久久久网站| 国产精品一区二区久久| 久久国产成人午夜aⅴ影院 | 久久久久久久精品成人热色戒| 精品人妻久久久久久888| 久久精品中文字幕有码| 日韩乱码人妻无码中文字幕久久| 国产成人精品久久| 久久国产色AV免费观看| 亚洲国产成人久久一区WWW| 久久久中文字幕| 国内精品人妻无码久久久影院| 亚洲精品无码久久久| 国产精品久久久天天影视香蕉 | 99久久精品国产综合一区| 国内精品人妻无码久久久影院导航 | 久久国产成人精品国产成人亚洲| 久久99国产综合精品免费| 久久亚洲sm情趣捆绑调教| 欧美日韩精品久久久久| 国产日韩久久久精品影院首页| 久久精品中文闷骚内射| 久久久久久久久久久精品尤物| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 精品久久久久久国产三级| 777米奇久久最新地址| 久久99精品国产自在现线小黄鸭| 蜜臀av性久久久久蜜臀aⅴ | 精品无码久久久久久国产| 99精品久久久久久久婷婷|