SuperManager.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #pragma once
  2. #include <thread>
  3. #include <mutex>
  4. #include <map>
  5. #include <string>
  6. #include <UDPSocket.h>
  7. #include <ProtocolHandler.h>
  8. #include <ZlDataDefine.h>
  9. #include "SuperTCPClient.h"
  10. //#include "SuperHandler.h"
  11. #include "SuperBuffer.h"
  12. #include "LibEventTCPClient.h"
  13. #include "SuperHandler.h"
  14. /*
  15. 同步策略 更新加定时
  16. */
  17. struct per_user_data
  18. {
  19. SOCKADDR_IN addr = { 0 };
  20. char ip[16] = { 0 };
  21. uint16_t port = 10090;
  22. CSuperBuffer m_buffer;
  23. CSuperTCPClient m_socket;
  24. CLibEventTCPClient m_client; //new
  25. CSuperHandler handler;
  26. uint32_t sendcount = 0;
  27. uint64_t sendlen = 0;
  28. uint32_t recvcount = 0;
  29. uint32_t sendfail = 0;
  30. uint32_t rectfail = 0;
  31. time_t tmLastSendBeart = 0;
  32. };
  33. class CSuperManager
  34. {
  35. private:
  36. CSuperManager();
  37. ~CSuperManager();
  38. public:
  39. BOOL Start(CString,uint16_t port = 10089);
  40. void Stop();
  41. inline uint8_t GetSuperNum(){
  42. return m_super_num;
  43. }
  44. inline string SendDesc()
  45. {
  46. string desc;
  47. for (const auto&it : m_super)
  48. {
  49. string strLog;
  50. auto& item = it.second.sendlen;
  51. if (item > 1024 * 1024 * 1024)
  52. strLog = fmt::format("{}GB {}MB {} KB", item / (1024 * 1024 * 1024),
  53. item % (1024 * 1024 * 1024) / (1024 * 1024), item % (1024 * 1024) / 1024);
  54. else if (item > 1024 * 1024)
  55. strLog = fmt::format("{}MB {} KB", item / (1024 * 1024), item % (1024 * 1024) / 1024);
  56. else
  57. strLog = fmt::format("{} KB ", item / 1024);
  58. desc += fmt::format("{} 包数:{} 流量:{};", it.first, it.second.sendcount, strLog);
  59. }
  60. return desc;
  61. }
  62. inline string FailDesc()
  63. {
  64. string desc;
  65. for (auto& it : m_super)
  66. desc += fmt::format("{} 包数:{}; 待发送:{}", it.first, it.second.sendfail, it.second.handler.tasksize());
  67. return desc;
  68. }
  69. inline string recvDesc()
  70. {
  71. string desc;
  72. for (auto& it : m_super)
  73. desc += fmt::format("{} 包数:{} 发送缓冲:{};", it.first, it.second.recvcount, it.second.m_client.send_queue_len());
  74. return desc;
  75. }
  76. inline void SendPack(LPBYTE pPack, int nPackLen, uint32_t packno, E_ZL_PROTOCAL protocal, bool r)
  77. {
  78. for (auto& it : m_super)
  79. //it.second.m_socket.Insert(pPack, nPackLen, packno, protocal, r);
  80. it.second.handler.Insert(pPack, nPackLen, packno, protocal, r);
  81. }
  82. inline static auto Instance() { return &obj; };
  83. private:
  84. static CSuperManager obj;
  85. static void ThreadProcForSend(DWORD_PTR);
  86. std::thread* m_pThread = nullptr;
  87. bool m_bWork = false;
  88. std::map<std::string, per_user_data> m_super; //ip,data
  89. uint8_t m_super_num = 0;
  90. };