SPClient.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 __SPCLIENT_H_
  20. #define __SPCLIENT_H_
  21. #include "FreeList.h"
  22. #include "TransferCalculator.h"
  23. #define P2P_BUF_SIZE BLOCK_SIZE+1024
  24. #define WM_NOMORESAMPLE WM_APP+12341
  25. // TCP传输的数据包
  26. class TCPPacket {
  27. public:
  28. TCPPacket() : size(0), sent(0) {};
  29. ~TCPPacket() {};
  30. char GetMsgType() {return buf[4];};
  31. UINT* GetBlockID() {return reinterpret_cast<UINT*>(buf+5);};
  32. UINT* GetBlockSize() {return reinterpret_cast<UINT*>(buf+9);};
  33. void Init() {};
  34. void Uninit() {};
  35. char buf[P2P_BUF_SIZE];
  36. // 要发送的消息大小
  37. int size;
  38. // 已经发送的大小
  39. int sent;
  40. };
  41. enum MSG_STATE {
  42. MSG_COMPLETE, MSG_UNCOMPLETE, MSG_ERR_SIZE, MSG_ERR_TYPE, MSG_REMOTE_ERR,
  43. };
  44. enum CONNECT_RESULT {CR_ERROR, CR_CONNECTED, CR_WOULDBLOCK};
  45. class BufferMgr;
  46. class LogMgr;
  47. class CaptureServer;
  48. class SPClient : public TransferCalculator {
  49. public:
  50. SPClient(CaptureServer* cServer, NormalAddress address, BufferMgr* bufferMgr, LogMgr* log);
  51. ~SPClient();
  52. private:
  53. BOOL BaseRecv();
  54. MSG_STATE ParseMsg();
  55. MSG_STATE OnWelcome();
  56. MSG_STATE OnMsg();
  57. BOOL SendRegister();
  58. BOOL SendBlock();
  59. BOOL SendUpdate();
  60.     BOOL SendMediaType();
  61. BOOL SendPackets();
  62. static void __stdcall RunReceiver(SPClient* client);
  63. CONNECT_RESULT Connecting();
  64. void Disconnect();
  65. private:
  66. SOCKET m_socket;
  67. // 接收数据的缓冲区
  68. char recvBuf[P2P_BUF_SIZE];
  69. // 缓冲区中数据的长度
  70. UINT recvOff;
  71. // 从接收到的数据包读取数据的移动指针
  72. char* recvPointer;
  73. // 向被发送的数据包写入数据的移动指针
  74. char* sendPointer;
  75. // 出错信息
  76. char errStr[30];
  77. // 即将被发送的Packet列表
  78. list<TCPPacket*> m_sendList;
  79. // TCPPacket动态分配/释放的列表
  80. FreeList<TCPPacket> m_freeList;
  81. // 每次编制发送消息时,第一步的操作
  82. BOOL SendBegin(TCPPacket*& packet, UINT8 msgType);
  83. // 每次编制发送消息时,最后一步的操作
  84. void SendEnd(TCPPacket*& packet);
  85. CaptureServer *cs;    //Capture Server
  86. BufferMgr* m_bufferMgr;
  87. LogMgr* logFile;
  88. NormalAddress addr;
  89. UINT lastSentBlockID; // store the block should send now
  90. BOOL    isRunning;
  91. BOOL    isLogin;
  92. HANDLE  hThread;
  93. // 校验块的正确与否
  94. SampleHeader header;
  95. int readData;
  96. // 利用memcpy复制数据,并且把src指针加上size
  97. static void CopyMoveSrc(void * des, const char *& src, size_t size);
  98. // 利用memcpy复制数据,并且把des指针加上size
  99. static void CopyMoveDes(char *& des, const void * src, size_t size);
  100. };
  101. #endif