CSClient.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:3k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #ifndef _CSCLIENT_H_
  20. #define _CSCLIENT_H_
  21. namespace NPLayer1 {
  22. class Communicator;
  23. class BaseResource;
  24. enum {
  25. // TS发来的UDP包的最大长度
  26. MAX_UDP_LEN = 1400, 
  27. };
  28. class CSClient {
  29. public:
  30. CSClient(Communicator* c);
  31. ~CSClient();
  32. // 解析消息
  33. BOOL ParseMsg(sockaddr_in& addr, int& addrlen);
  34. // 返回监听的Socket
  35. SOCKET GetSocket() { return m_Socket; };
  36. bool GetIsLogin() { return isLogin; }
  37. // 初始化,绑定一个监听端口
  38. P2P_RETURN_TYPE Init();
  39. void SendLogin();
  40. void SendResList();
  41. void SendReqRes();
  42. void SendDelRes(BaseResource* res);
  43. void SendReport(bool bRefresh);
  44. void SendNeedPeers();
  45. void SendQueryRes();
  46. void SendLogout();
  47. void SendReport2();
  48. void ResetLoginFail() {loginFailCount = 0;}
  49. // 利用memcpy复制数据,并且把src指针加上size
  50. static void CopyMoveSrc(void * des, const char *& src, size_t size);
  51. // 利用memcpy复制数据,并且把des指针加上size
  52. static void CopyMoveDes(char *& des, const void * src, size_t size);
  53. private:
  54. BOOL OnWelcome();
  55. BOOL OnPeers();
  56. BOOL OnConnectTo();
  57. BOOL OnResInfo();
  58. BOOL OnMsg();
  59. BOOL SwitchMsg(UINT8 msgType);
  60. // 每次编制发送消息时,第一步的操作
  61. BOOL SendBegin(UINT8 msgType);
  62. // 每次编制发送消息时,最后一步的操作
  63. void SendEnd();
  64. // 取得本机IP地址列表
  65. static UINT8 GetLocalIPList(in_addr*&);
  66. // 重新初始化
  67. void Reinit();
  68. private:
  69. enum {
  70. // 当发现known peer个数过少时,才发送NP2TS_NEED_PEERS
  71. MIN_KNOWN_PEERS=15,
  72. // 因为NP拥有的块可能有很多区间,但是不可能全部提交给TS,
  73. // 而且大多数情况下区间个数不会超过MAX_BLOCK_INTERVALS个,所以定义一个提交的最大个数
  74. MAX_BLOCK_INTERVALS = 20,
  75. // 连续登陆失败的次数,如果连续失败MAX_LOGIN_FAIL_COUNT次,就向界面报告
  76. MAX_LOGIN_FAIL_COUNT = 10, 
  77. };
  78. // 监听的Socket
  79. SOCKET m_Socket;
  80. // 是否已经成功登陆
  81. bool isLogin;
  82. // 是否继续登陆
  83. bool bStopLogin;
  84. // 是否成功请求了资源
  85. bool isReqResSucceed;
  86. // 接收数据的缓冲区
  87. char recvBuf[MAX_UDP_LEN];
  88. // 从接收到的数据包读取数据的移动指针,同样是
  89. // 向被发送的数据包写入数据的移动指针
  90. char* content;
  91. // 登陆失败的次数
  92. UINT loginFailCount;
  93. // 初始值是MAX_LOGIN_FAIL_COUNT,每次失败变成MAX_LOGIN_FAIL_COUNT倍
  94. UINT maxFailCount;
  95. // 发送消息的互斥变量
  96. CriticalSection sendCS;
  97. // TS返回的验证码
  98. char checkCode[7];
  99. Communicator* comm;
  100. // TEST: 测试代码,因为有时候Login之后NeedPeers不返回,只好再次登录
  101. // 利用这个变量记录上次收到Peers消息的时间,如果30秒内没收到新的Peers,就重新登录
  102. DWORD lastRecvPeers;
  103. };
  104. }
  105. #endif