青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大漠落日

while(!dead) study++;
posts - 46, comments - 126, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

FileZilla Server源碼分析(4)

Posted on 2010-06-25 11:11 亂78糟 閱讀(1237) 評論(0)  編輯 收藏 引用 所屬分類: 開源

    本節(jié)的分析是基于本系列第二篇FileZilla Server源碼分析(2之上,嚴格意義上來說是更為詳細的分析,深入了解CAsyncSocketEx的實現(xiàn),我將挑出重要的函數(shù)一一分析。

    函數(shù)名都為紅色粗體,并且?guī)б粚π±ㄌ枺绻ㄌ柌缓凶址?#8220;...”表示該函數(shù)無參數(shù),否則有參數(shù),具體什么參數(shù)不具體指明。變量均為黑色粗體。  


    首先來看一下該類的構造函數(shù)CAsyncSocketEx(),構造函數(shù)完成的是部分成員變量的初始化工作,其中最重要的是一個結構體變量m_SocketData,它的原型為:
   
    //Strucure to hold the socket data
    struct t_AsyncSocketExData
    {
        SOCKET hSocket; 
//Socket handle
        int nSocketIndex; //Index of socket, required by CAsyncSocketExHelperWindow
        int nFamily;
        addrinfo 
*addrInfo, *nextAddr; // Iterate through protocols on connect failure
        bool onCloseCalled; // Set to true on first received OnClose event
    } m_SocketData;

    還有m_pLocalAsyncSocketExThreadData的原型為:
//Pointer to the data of the local thread
    struct t_AsyncSocketExThreadData
    {
        CAsyncSocketExHelperWindow 
*m_pHelperWindow;
        
int nInstanceCount;
        DWORD nThreadId;
        std::list
<CAsyncSocketEx*> layerCloseNotify;
    } 
*m_pLocalAsyncSocketExThreadData;

    每個成員具體作用注釋已經比較清楚地說明了,后面用到的時候再指出。除了層NOLAYERS編譯(如果不明白,請看第二篇)此外還有一個宏條件編譯需要注意
#ifndef NOSOCKETSTATES
    m_nPendingEvents 
= 0//socket當前未決的網絡事件,例如FD_READ
    m_nState = notsock; //socket當前狀態(tài)
#endif //NOSOCKETSTATES

    析構函數(shù)~CAsyncSocketEx()調用函數(shù)Close()關閉socket,并調用FreeAsyncSocketExInstance()做清理工作。
    Close()函數(shù)中關閉層m_pFirstLayer->Close(),之后關閉成員變量m_SocketData.hSocket并且從輔助窗口m_pLocalAsyncSocketExThreadData->m_pHelperWindow記錄中移除掉這個socket,之后就是銷毀各種資源如地址、代理層等,有一個細節(jié),不明白的可以MSDN,不細說了。
   if (m_hAsyncGetHostByNameHandle)
        WSACancelAsyncRequest(m_hAsyncGetHostByNameHandle);
    m_hAsyncGetHostByNameHandle 
= NULL;

    再說FreeAsyncSocketExInstance()之前先說對應的函數(shù)InitAsyncSocketExInstance(),這兩個函數(shù)干的活都和一個static變量m_spAsyncSocketExThreadDataList有關,一個初始化,一個銷毀m_pLocalAsyncSocketExThreadData保存了當前線程的id和輔助窗口的指針。

    Create(...)函數(shù)創(chuàng)建代理層或者自身的socket以及做綁定到輔助窗口等操作。如果定義了使用代理層,那么所有關于socket的操作都會被代理層攔截,如create,listen,connect,accpet,recv,send,但是不包括bind,因為代理層create的時候已經提前綁定過了。
    TriggerEvent(...)這個函數(shù)用來觸發(fā)程序員指定的網絡事件,例如CControlSocket類中的Send(...)函數(shù)就調用了TriggerEvent(FD_WRITE)來觸發(fā)寫操作。它通過PosetMessage給輔助窗口,然后窗口通過消息處理函數(shù)WindowProc(...)處理這種種消息(詳細請參考第二節(jié))。
   
    與代理層相關的函數(shù),如AddLayer(...)RemoveAllLayers()等,還有設置獲取各種信息的函數(shù)如GetSockOpt()就不在詳述了。

    下面再補充之前函數(shù)WindowProc(...)關于網絡事件的詳細處理,僅僅針對非代理層的處理:
//if (!pSocket->m_pFirstLayer)
//{
   switch (nEvent)
   {
    
case FD_READ:
       
if (pSocket->GetState() == connecting && !nErrorCode)
        {
            pSocket
->m_nPendingEvents |= FD_READ; //如果正在連接,那么將讀事件加入未決事件變量里
            break;
        }
        
else if (pSocket->GetState() == attached)//已綁定成功的設置為連接成功
             pSocket->SetState(connected);
        
if (pSocket->GetState() != connected)    //如果還沒有連接成功,跳出
             break;

        
// Ignore further FD_READ events after FD_CLOSE has been received
        if (pSocket->m_SocketData.onCloseCalled)
            
break;
        
if (pSocket->m_lEvent & FD_READ)
        {
             DWORD nBytes 
= 0;
             
if (!nErrorCode)
             
if (!pSocket->IOCtl(FIONREAD, &nBytes)) //獲取要可讀的字節(jié)數(shù)
                  nErrorCode = WSAGetLastError();
             
if (nErrorCode)
                  pSocket
->SetState(aborted);    //出錯
             if (nBytes != 0 || nErrorCode != 0//通知socket已經有數(shù)據(jù)可以讀了
                  pSocket->OnReceive(nErrorCode);
         }
         
break;
   
case FD_FORCEREAD:
       
//除了不用獲取去可讀的字節(jié)數(shù)之外,完全可FD_READ一樣,這是作者自定義的類型
         break;
   
case FD_WRITE:
       
//前面的狀態(tài)判斷和FD_READ類似,不再詳述
       if (pSocket->m_lEvent & FD_WRITE)
       {
            
if (nErrorCode)
                pSocket
->SetState(aborted);

            pSocket
->OnSend(nErrorCode);//通知socket已經有數(shù)據(jù)可以發(fā)送了
        }
        
break;
    
case FD_CONNECT:
        
if (pSocket->GetState() == connecting)
        {
            
if (nErrorCode && pSocket->m_SocketData.nextAddr)  //有多個地址?
            {
                 
if (pSocket->TryNextProtocol())  //嘗試下一個協(xié)議地址
                      break;
             }
                 pSocket
->SetState(connected);
        }
        
else if (pSocket->GetState() == attached && !nErrorCode)
             pSocket
->SetState(connected);
        
if (pSocket->m_lEvent & FD_CONNECT)
             pSocket
->OnConnect(nErrorCode);
        
if (!nErrorCode)
        {
             
//判斷未決事件中是否期望的讀寫事件,如果有,通知socket
             if ((pSocket->m_nPendingEvents&FD_READ) && pSocket->GetState() == connected)
                 pSocket
->OnReceive(0);
             
if ((pSocket->m_nPendingEvents&FD_FORCEREAD) && pSocket->GetState() == connected)
                 pSocket
->OnReceive(0);
             
if ((pSocket->m_nPendingEvents&FD_WRITE) && pSocket->GetState() == connected)
                  pSocket
->OnSend(0);
         }
         pSocket
->m_nPendingEvents = 0;
         
break;
    
case FD_ACCPET:
         
//如果不是監(jiān)聽或已經綁定狀態(tài),跳出
         if (pSocket->GetState() != listening && pSocket->GetState() != attached)
              
break;
         
if (pSocket->m_lEvent & FD_ACCEPT)
              pSocket
->OnAccept(nErrorCode);//通知
         break;
    
case FD_CLOSE:
         
//沒有連接或綁定,跳出
         if (pSocket->GetState() != connected && pSocket->GetState() != attached)
              
break;

         
// If there are still bytes left to read, call OnReceive instead of
         
// OnClose and trigger a new OnClose
         DWORD nBytes = 0;
         
if (!nErrorCode && pSocket->IOCtl(FIONREAD, &nBytes))
         {
              
//作者的注釋很清楚,如果關閉的時候還有數(shù)據(jù)可讀,將當前pSocket->m_SocketData.onCloseCalled 設置為TRUE
              
//以表示需要再一次調用關閉函數(shù)OnClose
              if (nBytes > 0)
              {
                   
// Just repeat message.
                   PostMessage(hWnd, message, wParam, lParam);
                   pSocket
->m_SocketData.onCloseCalled = true;                               
                   pSocket
->OnReceive(WSAESHUTDOWN);
                   
break;
               }
          }

          pSocket
->SetState(nErrorCode?aborted:closed);
          pSocket
->OnClose(nErrorCode);
          
break;
   }
//}

   本節(jié)是對第二節(jié)的一個小補充,也算是對MS的CAsyncSocket類的一個另類剖析吧。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            羞羞色国产精品| 欧美在线国产| 国产精品久久久久久久久免费桃花 | 在线综合+亚洲+欧美中文字幕| 91久久精品美女高潮| 久久综合五月| 欧美国产视频日韩| 亚洲精品色婷婷福利天堂| 亚洲精品在线三区| 亚洲一区二区三区在线| 亚洲女ⅴideoshd黑人| 香蕉成人啪国产精品视频综合网| 久久久国产精品亚洲一区| 狼狼综合久久久久综合网| 欧美精品激情blacked18| 欧美日韩国产首页在线观看| 国产精品麻豆成人av电影艾秋| 国产一区在线播放| 亚洲裸体在线观看| 久久精精品视频| 亚洲伦理一区| 久久av免费一区| 欧美日韩视频专区在线播放| 韩国av一区二区三区在线观看| 日韩一区二区免费高清| 久久精品免费| 99re亚洲国产精品| 亚洲欧美日韩综合一区| 欧美va天堂在线| 国产欧美日韩精品一区| 日韩一区二区免费高清| 麻豆精品一区二区av白丝在线| 日韩午夜精品视频| 久久精品一区二区三区不卡牛牛| 欧美日本乱大交xxxxx| 悠悠资源网亚洲青| 欧美在线观看一区二区| 99热免费精品| 欧美激情亚洲国产| 国产综合av| 欧美在线视频免费| 日韩亚洲精品电影| 欧美精品 日韩| 亚洲二区精品| 久久这里只有精品视频首页| 亚洲在线观看| 欧美午夜电影网| 日韩一级黄色大片| 亚洲国产一区二区视频| 麻豆乱码国产一区二区三区| 国产三区二区一区久久| 亚洲自拍另类| 一区二区三区三区在线| 欧美日韩和欧美的一区二区| 亚洲精品国偷自产在线99热| 欧美成人精品影院| 麻豆成人在线观看| 亚洲欧洲精品一区二区精品久久久 | 午夜久久黄色| 亚洲精品护士| 欧美精品激情blacked18| 在线播放豆国产99亚洲| 久久一日本道色综合久久| 欧美一区二区三区在线观看| 国产一区二区久久| 久久国产福利国产秒拍| 欧美一区二区视频97| 国产亚洲欧美一级| 蜜桃av一区二区| 欧美成人精品影院| 夜夜嗨av一区二区三区四季av | 久久精品99无色码中文字幕| 国产专区一区| 欧美成人69| 欧美深夜福利| 欧美怡红院视频| 欧美在线免费观看亚洲| 亚洲第一综合天堂另类专| 亚洲成人资源网| 欧美视频在线观看视频极品| 香蕉久久一区二区不卡无毒影院| 午夜精品福利一区二区蜜股av| 国内精品一区二区| 亚洲国产欧美不卡在线观看| 欧美日韩在线不卡| 久久久久久尹人网香蕉| 欧美激情一区二区三区高清视频| 亚洲综合国产| 久久精品人人做人人综合| 亚洲精品国产无天堂网2021| 亚洲校园激情| 亚洲韩国青草视频| 亚洲男人第一网站| 亚洲另类黄色| 亚洲欧美日韩久久精品| 亚洲人成在线观看| 性欧美xxxx视频在线观看| 日韩视频一区二区三区在线播放免费观看 | 亚洲精品乱码久久久久久久久| 国产精品日日摸夜夜摸av| 久久成人免费网| 欧美日韩国产色视频| 另类人畜视频在线| 国产精品卡一卡二卡三| 亚洲人成网站777色婷婷| 国产视频综合在线| 亚洲免费不卡| 亚洲经典三级| 久久精品人人做人人爽电影蜜月| 亚洲一级在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲欧美日韩在线综合| 亚洲精品系列| 久久久国产精品一区二区三区| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久另类ts人妖一区二区| 午夜欧美精品久久久久久久| 欧美精品日韩| 亚洲国产精品高清久久久| 黄色av日韩| 欧美一区二区在线免费观看| 午夜视频精品| 国产精品乱人伦一区二区 | 久久综合久色欧美综合狠狠| 先锋亚洲精品| 欧美四级电影网站| 欧美国产精品日韩| 在线日韩av片| 久久久777| 久久综合九色九九| 国产综合色产在线精品| 欧美一区二区国产| 久久久精品国产免大香伊| 国产欧美视频一区二区三区| 亚洲一区二区欧美日韩| 亚洲综合清纯丝袜自拍| 国产精品国产三级国产普通话三级| 亚洲另类自拍| 亚洲一区二区精品在线| 欧美视频中文字幕在线| 正在播放亚洲一区| 欧美一区二区黄| 国产一区二区日韩精品欧美精品| 亚洲免费在线看| 久久乐国产精品| 亚洲国产精品成人一区二区| 欧美大胆成人| 亚洲精品自在久久| 亚洲欧美日产图| 国产亚洲福利一区| 久久中文在线| 日韩午夜黄色| 久久国产天堂福利天堂| 亚洲成人自拍视频| 欧美老女人xx| 亚洲一区二区成人在线观看| 久久久久久午夜| 亚洲精品视频一区| 国产精品你懂的在线| 久久精品免费| 亚洲精品久久久久久久久久久| 亚洲综合电影| 亚洲电影免费观看高清| 欧美视频亚洲视频| 久久av一区| 91久久精品国产91性色| 欧美在线影院在线视频| 亚洲欧洲精品一区二区三区不卡| 欧美日韩综合网| 久久久久久亚洲精品不卡4k岛国| 91久久精品国产91久久性色| 欧美一区二区三区免费看 | 欧美色欧美亚洲另类二区| 欧美亚洲视频| 亚洲精品视频免费在线观看| 欧美中文字幕在线| 欧美日韩一区二区免费在线观看 | 一二美女精品欧洲| 久久精品视频在线免费观看| 亚洲精品免费在线播放| 国产精品中文字幕在线观看| 美女任你摸久久| 午夜精品一区二区三区在线| 亚洲欧洲一区二区三区| 久久久久国产精品麻豆ai换脸| 日韩视频在线播放| 激情视频一区二区三区| 欧美午夜精品理论片a级按摩| 久久久久久久久久久久久9999 | 久久亚洲不卡| 亚洲欧美日韩国产中文 | 这里只有精品视频在线| 在线欧美影院| 国内精品久久久久影院薰衣草| 欧美日韩综合一区| 欧美精品久久久久久久久久| 玖玖综合伊人| 久久久久久一区| 欧美一区中文字幕| 亚洲欧美日韩精品在线|