精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

FileZilla 源代碼分析5

系統 Linux
FileZilla是一個免費開源的FTP客戶端軟件,分為客戶端版本和服務器版本,具備所有的FTP軟件功能。可控性、有條理的界面和管理多站點的簡化方式使得Filezilla客戶端版成為一個方便高效的FTP客戶端工具,而FileZilla Server則是一個小巧并且可靠的支持FTP&SFTP的FTP服務器軟件。

FileZilla是一種快速、可信賴的FTP客戶端以及服務器端開放源代碼程式,具有多種特色、直覺的接口。本文就給大家分析下FileZilla的源代碼。

  < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">

  在CServer的Create()中,創建對象CListenSocket來監聽21端口,來看看具體的代碼實現:

  CListenSocket *pListenSocket = new CListenSocket(this, ssl);

  if (!pListenSocket->Create(nPort, SOCK_STREAM, FD_ACCEPT, NULL) || !pListenSocket->Listen())

  基本上分三步:

  1、new CListenSocket:沒有什么特別的,基本就是初始化成員變量

  2、Create

  注:在所有的代碼中,先不看大量的if (m_pFirstLayer)這種代碼,這是CAsyncSocketExLayer的機制。

  Create其實調用的是父類CAsyncSocketEx的create()方法,這個方法中第一件事情就是建立m_spAsyncSocketExThreadDataList鏈、分發線程t_AsyncSocketExThreadData以及CAsyncSocketEx之間的關系,CAsyncSocketEx的create()方法首先調用InitAsyncSocketExInstance(),下面是CAsyncSocketEx::InitAsyncSocketExInstance()代碼片斷:

  DWORD id=GetCurrentThreadId();

  ...

  //Get thread specific data

  if (m_spAsyncSocketExThreadDataList) // 這個鏈已經建立了

  {

  t_AsyncSocketExThreadDataList *pList=m_spAsyncSocketExThreadDataList;

  while (pList) // 遍歷鏈

  {

  ASSERT(pList->pThreadData);

  ASSERT(pList->pThreadData->nInstanceCount>0);

  if (pList->pThreadData->nThreadId==id) // 對當前線程已經有分發線程了,就把當前socket的分發由這個分發線程來代理

  {

  m_pLocalAsyncSocketExThreadData=pList->pThreadData;

  m_pLocalAsyncSocketExThreadData->nInstanceCount++; // 多了這一個socket

  break;

  }

  pList=pList->pNext;

  }

  //Current thread yet has no sockets

  if (!pList) // 當前線程還沒有分發線程,則創建一個

  {

  //Initialize data for current thread

  pList=new t_AsyncSocketExThreadDataList;

  pList->pNext=m_spAsyncSocketExThreadDataList;

  m_spAsyncSocketExThreadDataList=pList;

  m_pLocalAsyncSocketExThreadData=new t_AsyncSocketExThreadData;

  m_pLocalAsyncSocketExThreadData->nInstanceCount=1; // 只掛了當前的socket

  m_pLocalAsyncSocketExThreadData->nThreadId=id; // 這個分發線程的threadID

  m_pLocalAsyncSocketExThreadData->m_pHelperWindow=new CAsyncSocketExHelperWindow(m_pLocalAsyncSocketExThreadData); // 為這個分發線程創建CAsyncSocketExHelperWindow

  m_spAsyncSocketExThreadDataList->pThreadData=m_pLocalAsyncSocketExThreadData;

  }

  }

  else // 如果分發線程鏈還沒有創建,則創建一個

  { //No thread has instances of CAsyncSocketEx; Initialize data

  m_spAsyncSocketExThreadDataList=new t_AsyncSocketExThreadDataList;

  m_spAsyncSocketExThreadDataList->pNext=0;

  m_pLocalAsyncSocketExThreadData=new t_AsyncSocketExThreadData; // 第一個分發線程

  m_pLocalAsyncSocketExThreadData->nInstanceCount=1; // 只掛了當前的socket

  m_pLocalAsyncSocketExThreadData->nThreadId=id; // 這個分發線程的threadID

  m_pLocalAsyncSocketExThreadData->m_pHelperWindow=new CAsyncSocketExHelperWindow(m_pLocalAsyncSocketExThreadData); // 為這個分發線程創建CAsyncSocketExHelperWindow

  m_spAsyncSocketExThreadDataList->pThreadData=m_pLocalAsyncSocketExThreadData;

  ...

  }

  下面看一個創建CAsyncSocketExHelperWindow的過程:

  CAsyncSocketExHelperWindow(CAsyncSocketEx::t_AsyncSocketExThreadData* pThreadData)

  {

  // m_pAsyncSocketExWindowData是一個t_AsyncSocketExWindowData數組,

  // 數組的每一個元素代表了一個CAsyncSocketEx,即要服務的socket

  //Initialize data

  m_pAsyncSocketExWindowData = new t_AsyncSocketExWindowData[512]; //Reserve space for 512 active sockets

  memset(m_pAsyncSocketExWindowData, 0, 512*sizeof(t_AsyncSocketExWindowData));

  m_nWindowDataSize=512; // 當前數組的大小,這是可自動擴充的,不過最大不能超過一個最大值

  m_nSocketCount=0; // 當前數組中CAsyncSocketEx的數量

  m_nWindowDataPos=0; // 如果要加一個新的CAsyncSocketEx進來,加到數組的哪個位置

  m_pThreadData = pThreadData; // 這個CAsyncSocketExHelperWindow對應的分發線程,兩者一一對應的

  // 下面創建一個標準的窗口,不過并不顯示出來

  //Create window

  WNDCLASSEX wndclass;

  wndclass.cbSize=sizeof wndclass;

  wndclass.style=0;

  wndclass.lpfnWndProc=WindowProc;

  wndclass.cbClsExtra=0;

  wndclass.cbWndExtra=0;

  wndclass.hInstance=GetModuleHandle(0);

  wndclass.hIcon=0;

  wndclass.hCursor=0;

  wndclass.hbrBackground=0;

  wndclass.lpszMenuName=0;

  wndclass.lpszClassName=_T("CAsyncSocketEx Helper Window");

  wndclass.hIconSm=0;

  RegisterClassEx(&wndclass);

  m_hWnd=CreateWindow(_T("CAsyncSocketEx Helper Window"), _T("CAsyncSocketEx Helper Window"), 0, 0, 0, 0, 0, 0, 0, 0, GetModuleHandle(0));

  ASSERT(m_hWnd);

  SetWindowLongPtr(m_hWnd, GWL_USERDATA, (LONG)this);

  };

  在調用完InitAsyncSocketExInstance()之后,CAsyncSocketEx的create()方法然后:

  SOCKET hSocket = socket(m_SocketData.nFamily, nSocketType, 0); // 這是真正的socket api,建立一個socket

  if (hSocket == INVALID_SOCKET)

  return FALSE;

  m_SocketData.hSocket = hSocket;

  AttachHandle(hSocket); // 將當前創建的socket加到分發線程管理中,這樣可以讓分發線程來負責這個socket的消息

  AttachHandle()調用了CAsyncSocketExHelperWindow的AddSocket方法:

  BOOL AddSocket(CAsyncSocketEx *pSocket, int &nSocketIndex)

  {

  ...

  //Search for free slot

  // 從m_nWindowDataPos開始搜索, 共搜m_nWindowDataSize個位置

  // 由于是下面的模運算i%m_nWindowDataSize,因此到達數組尾時,從重從繞回來,即收遍數組的每一個位置

  for (int i=m_nWindowDataPos;i<(m_nWindowDataSize+m_nWindowDataPos);i++)

  {

  // 注意模運算

  if (!m_pAsyncSocketExWindowData[i%m_nWindowDataSize].m_pSocket) // 這個位置是空的

  {

  m_pAsyncSocketExWindowData[i%m_nWindowDataSize].m_pSocket=pSocket;

  nSocketIndex=i%m_nWindowDataSize; // 在list中的pos

  m_nWindowDataPos=(i+1)%m_nWindowDataSize; // 以后從下一個搜索位置開臺

  m_nSocketCount++;

  return TRUE;

  }

  }

  ...

  }

  即在CAsyncSocketExHelperWindow管理的socket數組中,加上這次的這個CAsyncSocketEx。

  CAsyncSocketEx的create()方法然后:

  if (!AsyncSelect(lEvent))

  {

  Close();

  return FALSE;

  }

  這里AsyncSelect()方法里調用了windows socket api: WSAAsyncSelect(),這個方法可以讓windows在CAsyncSocketEx指定的socket上,當socket事件accept, read, write等發生時,發送消息到CAsyncSocketExHelperWindow中的窗口hWnd,然后CAsyncSocketExHelperWindow再通過回調函數WindowProc將消息發回到負責處理這個消息的CAsyncSocketEx上(這部分下面再詳細分析)。

  繼續CAsyncSocketEx的create()方法:

  if (!Bind(nSocketPort, lpszSocketAddress))

  {

  Close();

  return FALSE;

  }

  Bind()實際上調用了socket api: bind()方法,實現了local address和socket的綁定。

  3、Listen

  create完以后,就是listen,這個比較簡單,直接調用了socket api: listen(),在指定地址、端口進行監聽。

  程序運行到這里,核心的類已經初始化完成了,下面分析當socket有活動時,消息是如何從CAsyncSocketExHelperWindo分發到CAsyncSocketEx的。

  < type="text/javascript"> < src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">

通過文章完整的描述,大家應該知道了FileZilla 源代碼,希望對大家有幫助!

【編輯推薦】

責任編輯:趙鵬 來源: 網絡轉載
相關推薦

2011-02-23 15:33:42

FileZilla

2011-02-23 14:26:28

FileZilla

2011-02-23 13:47:33

FileZilla

2011-02-23 15:21:06

FileZilla

2011-02-23 15:11:27

FileZilla

2011-02-23 15:26:01

FileZilla

2011-02-23 14:39:27

FileZilla

2011-02-23 14:16:43

FileZilla

2011-02-23 14:54:58

FileZilla

2011-03-01 16:32:58

FileZilla

2011-03-01 16:25:37

FileZilla

2011-03-01 16:01:08

FileZilla

2011-03-01 16:19:27

FileZilla

2023-12-26 14:35:37

2015-08-28 09:38:51

Linux源代碼分析工具

2018-05-25 14:16:55

NFS源代碼線程

2009-07-02 13:59:35

JSP后臺

2015-08-26 17:38:47

Linux源代碼

2011-08-24 15:42:38

LUA源代碼

2020-02-24 09:25:33

代碼開發工具
點贊
收藏

51CTO技術棧公眾號

久草在线中文最新视频| 国产乱淫片视频| 久久影院资源站| 午夜日韩在线电影| 精品国产露脸精彩对白| 蜜桃麻豆91| 无码人妻av一区二区三区波多野| 欧美丝袜激情| 91精品国产手机| 国产高清精品一区二区三区| 精品成人免费视频| 四虎在线视频| 亚洲综合日本| 色婷婷综合成人av| 人妻 丝袜美腿 中文字幕| 日本在线一区| 日本少妇xxxx动漫| 9l视频自拍蝌蚪9l视频成人| 91丝袜美腿高跟国产极品老师 | 亚洲精品手机在线观看| 成人黄色免费视频| 午夜在线一区二区| 日韩中文视频免费在线观看| 波多野结衣一二三区| 欧美成人视屏| 青草国产精品久久久久久| 欧美日韩成人在线播放| 人妻视频一区二区| 91高清视频在线观看| 久久青草国产手机看片福利盒子| 91精品国产自产在线| 久久久午夜影院| 久久久久久久久久久妇女| 蜜桃久久av| 亚洲第一综合天堂另类专| 丝袜制服一区二区三区| 亚洲欧美日韩动漫| 国产乱码字幕精品高清av| 日本精品免费观看| 久久伊人成人网| 久久中文字幕av| 欧美视频精品在线| 欧美精品久久久| 99视频免费看| 久久成人久久鬼色| 国产精品日韩一区| a天堂视频在线观看| 韩国精品视频在线观看| 一道本成人在线| 97干在线视频| 亚洲va天堂va欧美ⅴa在线| 久久激情视频| 欧美国产亚洲精品久久久8v| 91杏吧porn蝌蚪| 成人3d精品动漫精品一二三| 亚洲免费高清视频| 老太脱裤子让老头玩xxxxx| 成人午夜在线影视| 17c精品麻豆一区二区免费| 日韩免费av在线| 天海翼一区二区| 亚洲午夜精品久久久久久app| 久久精品一区中文字幕| 蜜臀一区二区三区精品免费视频 | 国内毛片毛片毛片毛片| 久久久久欧美精品| 欧洲精品久久久| 9i看片成人免费看片| 一本色道久久综合亚洲精品不卡 | 久久r这里只有精品| 亚洲大奶少妇| 4hu四虎永久在线影院成人| 午夜免费高清视频| 91av一区| 欧美日韩成人在线| 在线免费看污网站| 台湾佬成人网| 色婷婷激情一区二区三区| 少妇人妻互换不带套| 日韩高清中文字幕一区二区| 91成人在线精品| 91视频网页| 国内精品国产成人国产三级| 国产suv精品一区二区883| 99在线看视频| 日韩av地址| 久久免费国产精品| 日韩一区国产在线观看| 素人av在线| 成人小视频在线观看| 国产不卡一区二区在线观看| 人妻精品无码一区二区| 91老师片黄在线观看| 欧美日韩在线播放一区二区| av在线中文| 不卡电影免费在线播放一区| 国产99久久久欧美黑人| 色婷婷久久综合中文久久蜜桃av| 精品一区二区免费| 亚洲最大av网| 亚洲欧洲综合在线| 国产精品国产三级国产| 女人被男人躁得好爽免费视频| 久久久男人天堂| 欧美日韩三级一区二区| 免费人成视频在线播放| 你懂的视频欧美| 日韩美女在线视频| 波多野结衣av在线免费观看| 手机亚洲手机国产手机日韩| 欧美日韩成人在线播放| 亚洲 日本 欧美 中文幕| 国产又黄又大久久| 欧美日韩精品久久| 污影院在线观看| 色狠狠桃花综合| 性生交大片免费看l| 精品亚洲a∨| 精品久久久三级丝袜| 日韩av.com| 台湾色综合娱乐中文网| 亚洲精品在线观| 日韩黄色中文字幕| av成人国产| 国产成人久久精品| 欧美 日韩 国产 成人 在线 91| 欧美国产成人在线| 亚洲熟妇无码另类久久久| 小说区图片区亚洲| 亚洲日本欧美日韩高观看| 欧美三级日本三级| 麻豆91精品| 不卡视频一区二区三区| 一区二区三区视频网站| 日韩欧美亚洲成人| 88av在线播放| 欧美成人一区在线观看| 欧美成人一区在线| 日韩精品在线一区二区三区| 波多野结衣中文字幕一区| 亚洲永久激情精品| 四虎影视4hu4虎成人| 欧美日韩国产一区中文午夜| 熟妇无码乱子成人精品| 日韩精品诱惑一区?区三区| 青青久久av北条麻妃海外网| 噜噜噜久久,亚洲精品国产品| 成人美女在线观看| 艳母动漫在线观看| 欧美成人毛片| 中文字幕一区二区精品| 日韩久久久久久久久久| 久久久精品国产免大香伊| 欧美 丝袜 自拍 制服 另类| 国产人妖ts一区二区| 欧美激情亚洲一区| 亚洲国产剧情在线观看| 伊人一区二区三区| 中文字幕第10页| 亚洲成人一区| 91久久久久久久久| 成人在线免费看片| 欧美成人一区二区三区在线观看| 国产亚洲精品久久777777| 成人av免费观看| 国产精品秘入口18禁麻豆免会员 | 亚洲国产高清福利视频| 美女又爽又黄免费视频| 日本一区二区三区免费乱视频| www.com操| 欧美va天堂| 久久综合伊人77777麻豆| 国产精成人品2018| 欧美成人激情视频| 无码国产精品一区二区色情男同| 色久综合一二码| 国产av无码专区亚洲av毛网站| 成人av免费网站| www.天天射.com| 午夜日韩在线| 视频一区三区| 盗摄牛牛av影视一区二区| 国产精品夫妻激情| 日本高清成人vr专区| 欧美日韩国产在线| 99久久99久久精品免费| 成人网男人的天堂| 黄色三级视频在线| 亚洲特级毛片| 亚洲欧美久久234| 欧美色网一区| 久久国产精彩视频| 天堂成人在线| 欧美一级久久久| www.色国产| 亚洲永久精品大片| 超碰91在线播放| 性色av一区二区怡红| 黑人巨大国产9丨视频| 伊人久久大香线蕉无限次| 91超碰rencao97精品| 日韩和的一区二在线| 亚洲色图美腿丝袜| 亚洲a视频在线观看| 欧美日韩成人在线一区| 色一情一乱一伦| 亚洲午夜av在线| 午夜成人亚洲理伦片在线观看| 99久久99久久精品免费看蜜桃| 在线一区二区不卡| 天堂一区二区在线| 成年人午夜视频在线观看| 中文字幕人成人乱码| 91九色在线免费视频| 欧美中文字幕精在线不卡| 欧美精品18videos性欧美| 人人干在线视频| 亚洲人午夜精品| 五月婷婷丁香六月| 亚洲高清福利视频| www.五月天激情| 宅男在线国产精品| 中文字幕视频一区二区| 一本一道波多野结衣一区二区| 精品在线视频观看| 一区二区三区在线影院| 神马午夜精品91| 国产精品久久久久久久久晋中| 受虐m奴xxx在线观看| 97精品电影院| 97人妻天天摸天天爽天天| 粉嫩av一区二区三区在线播放 | 国产嫩草影院久久久久| 国产吞精囗交久久久| jvid福利写真一区二区三区| 少妇高清精品毛片在线视频| 一区二区国产精品| 日本a在线免费观看| 亚洲二区精品| 18禁免费观看网站| 国产一级久久| 黄在线观看网站| 国产精品普通话对白| 国模吧无码一区二区三区| 国产日韩一区二区三区在线| 欧洲黄色一级视频| 午夜在线一区| 国产理论在线播放| 久久成人久久爱| 午夜诱惑痒痒网| 国产经典欧美精品| 好吊操视频这里只有精品| 国产在线观看免费一区| av影片在线播放| 成人免费视频免费观看| 国产网站无遮挡| 久久亚洲精华国产精华液| 国产三级av在线播放| 国产精品久久久久四虎| 中文字幕av免费在线观看| 午夜影院久久久| 黄色污污网站在线观看| 欧美日韩成人激情| 精品国产乱码一区二区三| 亚洲成人教育av| 美国一级片在线免费观看视频 | 黑人精品一区| 国产精品久久久久久亚洲影视| 国产欧美88| 国产精品成人播放| 涩涩涩久久久成人精品 | 精品成人影院| 国产精选在线观看91| 亚洲精品中文字幕99999| 日韩在线三区| 欧美激情四色| 久久国产色av免费观看| 国产精一区二区三区| 中文字幕免费看| 亚洲免费大片在线观看| 亚洲免费在线视频观看| 欧美二区三区91| 头脑特工队2免费完整版在线观看| 中文字幕av日韩| 97超碰在线免费| 国产精品香蕉国产| 久久91在线| 一区二区三区在线观看www| 欧美区一区二| 黄色av免费在线播放| 香蕉久久夜色精品国产| 亚洲精品自拍网| 9久草视频在线视频精品| 日日操免费视频| 同产精品九九九| 国产又大又黄的视频| 亚洲精品v欧美精品v日韩精品| 亚乱亚乱亚洲乱妇| 97精品免费视频| 一级欧美视频| 欧美日韩亚洲一区二区三区在线观看| 91tv精品福利国产在线观看| 麻豆av免费在线| 成人a区在线观看| 在线日韩国产网站| 日本高清视频一区二区| 天堂中文在线资源| 另类图片亚洲另类| 韩国精品视频在线观看 | 精品视频色一区| 天天影院图片亚洲| 久久久久亚洲精品| 国产日韩一区二区三免费高清| 日本一区视频在线| 国产精品一国产精品k频道56| 久久久久国产免费| 亚洲欧美国产77777| 中文字幕 视频一区| 亚洲全黄一级网站| 擼擼色在线看观看免费| 动漫精品视频| 欧美日韩国产探花| 性一交一黄一片| 亚洲精品视频自拍| 国产精品一区二区黑人巨大| 日韩有码在线视频| 日日夜夜精品一区| 国产精品九九九| 狠狠色丁香婷婷综合影院| 37pao成人国产永久免费视频| 不卡的av电影| 日产精品久久久久| 亚洲国产精品一区二区三区| 999福利在线视频| 国产精品中出一区二区三区| 日韩视频久久| 天天插天天射天天干| 黄色成人在线免费| 五月激情六月婷婷| 青青久久aⅴ北条麻妃| 视频一区中文| 欧美黑人又粗又大又爽免费| 中文字幕精品在线不卡| 亚洲图片欧美在线| www.久久撸.com| 日本久久伊人| 人妻少妇精品久久| 久久亚洲影视婷婷| 亚洲 小说区 图片区| www.色综合| 日本免费一区二区视频| 欧美视频在线第一页| 久热精品视频| 国产三级av在线播放| 欧美日韩日日摸| 亚洲欧美成人影院| 国产中文一区二区| 久久亚洲风情| 亚洲人与黑人屁股眼交| 欧美不卡123| 在线观看涩涩| 亚洲欧美日韩在线综合 | 日本一二三区在线观看| 日韩一区二区免费在线电影| 欧美1234区| 免费久久久一本精品久久区| 琪琪一区二区三区| 五月婷婷一区二区| 亚洲激情在线观看视频免费| 亚洲成人人体| 2021国产视频| 久久免费国产精品| 国产欧美一区二区三区视频在线观看| 久久99热精品这里久久精品| 欧美尿孔扩张虐视频| 日本久久久久久久久久久久| 亚洲美女屁股眼交| 男人的天堂在线免费视频| 91久久国产精品| 国产精品日韩欧美一区| 女同久久另类69精品国产| 亚洲福利影片在线| 日韩av黄色| 日韩欧美国产综合在线| 国产精品乱码一区二区三区软件| 国产丰满美女做爰| 国产mv久久久| 国产精品草草| 成人一级片免费看| 亚洲精品第一页| 亚洲国产伊人| 男人透女人免费视频| 一区二区不卡在线播放| 不卡在线视频| 精品一区二区三区国产| 久草这里只有精品视频| 伦av综合一区| 久久久久中文字幕| 中文字幕人成人乱码| 中文字幕黄色网址|