公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

飛鴿傳書源代碼

admin
2016年12月23日 18:37 本文熱度 6558
本文分析了飛鴿傳輸核心傳送過程。
  1. DWORD WINAPI TMainWin::SendFileThread(void *_sendFileObj)
  2. {
  3. SendFileObj *obj = (SendFileObj *)_sendFileObj;
  4. fd_set fds;
  5. fd_set *rfds = NULL, *wfds = &fds;
  6. timeval tv;
  7. int sock_ret;
  8. BOOL ret = FALSE, completeWait = FALSE;
  9. // 這里SendFileFunc根據command類型自動選擇兩種函數 : send file or send directory
  10. BOOL (TMainWin::*SendFileFunc)(SendFileObj *obj) =
  11. obj->command == IPMSG_GETDIRFILES ? TMainWin::SendDirFile : TMainWin::SendFile;
  12. FD_ZERO(&fds);
  13. FD_SET(obj->conInfo->sd, &fds);
  14. // 這里for條件引入了一個簡單的超時機制
  15. // 正常情況下,只要文件未傳送完,循環不會退出
  16. for (int waitCnt=0; waitCnt < 180 && obj->hThread != NULL; waitCnt++)
  17. {
  18. tv.tv_sec = 1, tv.tv_usec = 0;
  19. // 這里select有什么用途呢? 對于select功能我還不是完全明白
  20. // 根據我的分析,這里主要是利用了select函數的等待功能
  21. // 如果sd描述符沒有就緒,則在select中最久等待1秒
  22. // 如此反復等待最多180次,也就是3分鐘,超過三分鐘后,for循環結束
  23. if ((sock_ret = ::select(obj->conInfo->sd + 1, rfds, wfds, NULL, &tv)) > 0)
  24. {
  25. // 套接字可用,清除等待
  26. waitCnt = 0;
  27. //下面的代碼是一個有限狀態機
  28. if (completeWait)
  29. {
  30. // 本分支在文件發送完后執行
  31. if (::recv(obj->conInfo->sd, (char *)&ret, sizeof(ret), 0) >= 0)
  32. ret = TRUE;
  33. break;
  34. }
  35. else if ((mainWin->*SendFileFunc)(obj) != TRUE)
  36. {
  37. //本分支僅在發送出錯時進行
  38. break;
  39. }
  40. else if (obj->status == FS_COMPLETE)
  41. {
  42. // 本分支在發送完成后執行
  43. completeWait = TRUE, rfds = &fds, wfds = NULL;
  44. if (obj->fileSize == 0) { ret = TRUE; break; }
  45. }
  46. }
  47. else if (sock_ret == 0) {
  48. // select超時,重置fds
  49. FD_ZERO(&fds);
  50. FD_SET(obj->conInfo->sd, &fds);
  51. }
  52. else if (sock_ret == SOCKET_ERROR) {
  53. // select錯誤,算了,離去吧~
  54. break;
  55. }
  56. }
  57. // 如果發送的是文件夾,還需要擦一下屁股
  58. if (obj->isDir)
  59. {
  60. mainWin->CloseSendFile(obj);
  61. while (--obj->dirCnt >= 0)
  62. ::FindClose(obj->hDir[obj->dirCnt]);
  63. }
  64. // ret是對方發回的返回值,告知發送方是否完成接收
  65. obj->status = ret ? FS_COMPLETE : FS_ERROR;
  66. // 發送TCPEVENT消息,關閉句柄
  67. // 消息處理流程: EventUser->TcpEvent->EndSendFile
  68. mainWin->PostMessage(WM_TCPEVENT, obj->conInfo->sd, FD_CLOSE);
  69. // 退出發送線程
  70. ::ExitThread(0);
  71. return 0;
  72. }

上面傳送數據最重要的一句是:

else if ((mainWin->*SendFileFunc)(obj) != TRUE)

SendFileFunc的實際內容是什么呢?由函數開始賦值的指針知道:

  1. BOOL TMainWin::SendFile(SendFileObj *obj)
  2. {
  3. if (obj == NULL || obj->hFile == INVALID_HANDLE_VALUE) //判斷文件句柄是否合法
  4. return FALSE;
  5. int size = 0;
  6. _int64 remain = obj->fileSize - obj->offset; //取得還需要傳遞的總字節數
  7. //傳數據
  8. if (remain > 0 && (size = ::send(obj->conInfo->sd, obj->mapAddr + (obj->offset % cfg->ViewMax), remain > cfg->TransMax ? cfg->TransMax : (int)remain, 0)) < 0)
  9. return FALSE;
  10. // 根據本次成功發送的數據量,調整offset
  11. obj->offset += size;
  12. // 如果offset等于文件大小了,那么設置obj狀態為完成
  13. // 由于存在傳文件夾模式和傳文件模式,所以狀態分情況設置
  14. if (obj->offset == obj->fileSize)
  15. obj->status = obj->command == IPMSG_GETDIRFILES ? FS_ENDFILE : FS_COMPLETE;
  16. else if ((obj->offset % cfg->ViewMax) == 0)//沒有完成,但是已經傳送完成了本部分數據映射,需要調整映射窗口
  17. {
  18. ::UnmapViewOfFile(obj->mapAddr); // 刪除舊映射
  19. remain = obj->fileSize - obj->offset; // 計算新的剩余量
  20. // 映射下一塊,一次8M ,如果只剩下最后一點了,則少于8M (remain)
  21. obj->mapAddr = (char *)::MapViewOfFile(obj->hMap, FILE_MAP_READ, (int)(obj->offset >> 32), (int)obj->offset, (int)(remain > cfg->ViewMax ? cfg->ViewMax : remain));
  22. }
  23. // 更新總消耗時間
  24. obj->conInfo->lastTick = ::GetTickCount();
  25. return TRUE;
  26. }

很多朋友向我要飛鴿帶注釋的源碼,實在很抱歉,我只注釋了這么多,其余的也沒有深入地看。如果你對帶注釋的源碼感興趣,不妨來這里看看:http://code.google.com/p/ipigeon/這是我在GoogleCode上開的一個項目,大家一起來注釋飛鴿源碼吧!

該文章在 2016/12/23 18:37:41 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 18禁欧美猛交xxxxx无码 | 国产专区视频在线12 | 国产喷水在线观看 | 91se在线看片国产免费 | 国产精品人妻无码久久久豆 | 国产精品午夜福利在线观看地址 | 国产av巨作丝袜秘书 | 国产成人啪精品短视频 | 黑色丝袜脚足国产在线看 | 成年人深夜福利 | 国产经典一区二区三区蜜芽 | 成人无码精品 | 岛国岛国免费v片在线观看 岛国动作片免费免费全集观看 | 国产大片91精品免费观看3 | 国产高清国内精品福利99久久 | 国产精品无码一二三视频 | 国产色无码精品视频免费 | 成人精品午夜无码免费视小黄人 | 精品国产aⅴ无码一区二区 精品国产aⅴ一区二区三区 | 国产熟女亚洲精品明星自拍 | 国产精品日产欧美在线一区 | 国产无套白浆视频在线观看 | 国产精品女人伦一区二区三区 | 国产熟女真实乱精品视频 | 国产成人户外露出视频在线观看 | 国产美女福利视频一区二区 | 国产精品萌白酱永久在线观看 | 国产三级欧美三级日产三级99 | 东京热人妻无码一区二区av | 成人欧美日韩视频一区 | 国产亚洲漂亮白嫩美女在线 | 国产色综合一区二区三区 | av一区二区中文字幕 | 成人午夜精品福利视频 | 丰满人妻av无码一区二区软件 | av黄色| 成人午夜影院 | 高清无码一区二区在线观看 | 国产无码精品一区二区三区 | 3d肉蒲完整版下载 | 91精品福利自产拍在线观看 |