HandleHolder.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. //-----------------------------------------------------------------------------
  2. // 一个自动释放句柄的容器
  3. // 在析构时, 自动调用 CloseHandle
  4. //-----------------------------------------------------------------------------
  5. #pragma once
  6. //-----------------------------------------------------------------------------
  7. // HandleHolder
  8. //-----------------------------------------------------------------------------
  9. class HandleHolder
  10. {
  11. protected:
  12. HANDLE m_Handle;
  13. public:
  14. HandleHolder (HANDLE from) : m_Handle (from)
  15. {
  16. assert (m_Handle != 0);
  17. assert (m_Handle != INVALID_HANDLE_VALUE);
  18. }
  19. ~HandleHolder ()
  20. {
  21. Close ();
  22. }
  23. public:
  24. HandleHolder (HandleHolder && from) { m_Handle = from.m_Handle; from.m_Handle = 0; }
  25. HandleHolder & operator = (HandleHolder && from) { m_Handle = from.m_Handle; from.m_Handle = 0; }
  26. private:
  27. // 禁止拷贝构造函数, 禁止复制
  28. HandleHolder (const HandleHolder & h) = delete;
  29. HandleHolder & operator = (const HandleHolder & h) = delete;
  30. public:
  31. HANDLE Detach ()
  32. {
  33. auto fd = InterlockedExchange (reinterpret_cast <unsigned __int64 *> (&m_Handle), 0);
  34. return (reinterpret_cast <HANDLE> (fd));
  35. }
  36. HANDLE Get ()
  37. {
  38. assert (m_Handle != 0);
  39. assert (m_Handle != INVALID_HANDLE_VALUE);
  40. return m_Handle;
  41. }
  42. // 返回 -1, 表示读失败
  43. int Read (void * vPtr, int count)
  44. {
  45. assert (m_Handle != 0);
  46. assert (m_Handle != INVALID_HANDLE_VALUE);
  47. DWORD nbOfRead = 0;
  48. auto rc = ReadFile (m_Handle, vPtr, count, &nbOfRead, nullptr);
  49. if (rc)
  50. {
  51. Tillnow.cbRecv += nbOfRead;
  52. Snapshot.cbRecv += nbOfRead;
  53. return nbOfRead;
  54. }
  55. auto ec = GetLastError (); // 0x6D (109), 管道已结束. 作为 SCP 时, 这个错误很常见
  56. return -1;
  57. }
  58. // 返回 -1, 表示写失败
  59. int Write (const void * vPtr, int count)
  60. {
  61. assert (m_Handle != 0);
  62. assert (m_Handle != INVALID_HANDLE_VALUE);
  63. DWORD nbOfWrite = 0;
  64. auto rc = WriteFile (m_Handle, vPtr, count, &nbOfWrite, nullptr);
  65. if (rc)
  66. {
  67. Tillnow.cbSend += nbOfWrite;
  68. Snapshot.cbSend += nbOfWrite;
  69. return nbOfWrite;
  70. }
  71. auto ec = GetLastError (); // 0x6D (109), 管道已结束. 作为 SCP 时, 这个错误很常见
  72. return -1;
  73. }
  74. bool IsClosed () const { return m_Handle == 0 || m_Handle == INVALID_HANDLE_VALUE; }
  75. void Close ()
  76. {
  77. auto fd = Detach ();
  78. if (fd)
  79. CloseHandle (fd);
  80. }
  81. eSTR::DString ToString () const { return eSTR::DString (); } // 用于日志,跟踪等
  82. public:
  83. // 获得 <Tillnow.cbSend, Tillnow.cbRecv>
  84. auto GetFlowRate () const->std::tuple <DWORD, DWORD>
  85. {
  86. return { Tillnow.cbSend, Tillnow.cbRecv };
  87. }
  88. // 获得 <Snapshot.cbSend, Snapshot.cbRecv>.
  89. // 函数返回后, 我的成员 Snapshot.cbSend, Snapshot.cbRecv 都被置为 0
  90. auto SwapFlowRate ()->std::tuple <DWORD, DWORD>
  91. {
  92. auto S = Snapshot.cbSend;
  93. auto R = Snapshot.cbRecv;
  94. Snapshot.cbSend = 0;
  95. Snapshot.cbRecv = 0;
  96. return { S, R };
  97. }
  98. protected:
  99. struct
  100. {
  101. UINT cbSend = 0;
  102. UINT cbRecv = 0;
  103. } Tillnow; // 从 Socket 创建到现在的统计量
  104. struct
  105. {
  106. UINT cbSend = 0;
  107. UINT cbRecv = 0;
  108. } Snapshot; // 每次调用 SwapFlowRate 后, 返回这两个值
  109. };
  110. class HandleHolderEx : public HandleHolder
  111. {
  112. using base = HandleHolder;
  113. public:
  114. HandleHolderEx (HANDLE from, const eSTR::DString & Info) : base (from), m_Info (Info)
  115. {
  116. m_SeriesNo = InterlockedIncrement (&S_SeriesNo);
  117. }
  118. public:
  119. ULONG GetSeriesNo () const { return m_SeriesNo; }
  120. eSTR::DString ToString () const { return m_Info; }
  121. eSTR::DString GetAddress () const { return m_Info; }
  122. public:
  123. DWORD GetWireVersion () const { return m_WireVersion; }
  124. void SetWireVersion (DWORD ver) { m_WireVersion = ver; }
  125. private:
  126. ULONG m_SeriesNo = 0; // 序列号,用于跟踪
  127. DWORD m_WireVersion = 0; // 由使用者维护/引用这个项
  128. eSTR::DString m_Info;
  129. inline static long volatile S_SeriesNo = 0;
  130. };