SATClient.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. #include "stdafx.h"
  2. #include "SATClient.h"
  3. //#include <ws2def.h>
  4. #include "DlgProBar.h"
  5. const int SOCK_TCP = SOCK_STREAM - 1;
  6. const int SOCK_UDP = SOCK_DGRAM - 1;
  7. const int AF_IPV4 = 0;
  8. const int AF_IPV6 = 1;
  9. #define PAK_LEN sizeof(SATPROTO::DataHeader)
  10. #define HEADER_LEN sizeof(SATPROTO::DataHeader)
  11. // 进度条;
  12. CDlgProBar* g_pDlgProBar = NULL;
  13. void CSATClient::OnThreadBegin(CSocketHandle* pSH)
  14. {
  15. ASSERT(pSH == m_SocketClient);
  16. (pSH);
  17. CString strAddr;
  18. SockAddrIn sockAddr;
  19. m_SocketClient->GetSockName(sockAddr);
  20. GetAddress(sockAddr, strAddr);
  21. InitializeCriticalSection(&pSH->m_hClient2SrvSection);
  22. }
  23. void CSATClient::OnThreadExit(CSocketHandle* pSH)
  24. {
  25. ASSERT(pSH == m_SocketClient);
  26. DeleteCriticalSection(&pSH->m_hClient2SrvSection);
  27. m_bSocket = FALSE;
  28. TRACE(_T("======线程退出.\r\n"));
  29. (pSH);
  30. }
  31. void CSATClient::OnDataReceived(CSocketHandle* pSH, const BYTE* pbData, DWORD dwCount, const SockAddrIn& addr)
  32. {
  33. ASSERT(pSH == m_SocketClient);
  34. (pSH);
  35. if (!m_SocketClient->IsOpen()) return;
  36. OnReceive(pbData, dwCount);
  37. }
  38. void CSATClient::OnConnectionDropped(CSocketHandle* pSH)
  39. {
  40. ASSERT(pSH == m_SocketClient);
  41. (pSH);
  42. TRACE(_T("======连接服务器断开.\r\n"));
  43. m_bSocket = FALSE;
  44. }
  45. void CSATClient::OnConnectionError(CSocketHandle* pSH, DWORD dwError)
  46. {
  47. ASSERT(pSH == m_SocketClient);
  48. (pSH);
  49. _com_error err(dwError);
  50. m_bSocket = FALSE;
  51. }
  52. CSATClient::CSATClient(void)
  53. {
  54. m_nMode = AF_IPV4;
  55. m_nSockType = SOCK_TCP;
  56. m_SocketClient.SetInterface(this);
  57. m_bSocket = FALSE;
  58. }
  59. CSATClient::~CSATClient(void)
  60. {
  61. }
  62. bool CSATClient::OnSend(const byte* pData, int nLen, BOOL bShowGif)
  63. {
  64. if (!m_bSocket) {
  65. if (!Start())
  66. return false;
  67. }
  68. DWORD dwLen = m_SocketClient.Write((const LPBYTE)pData, nLen);
  69. if (dwLen == nLen)
  70. {
  71. if (bShowGif) {
  72. CDlgProBar dlg;
  73. g_pDlgProBar = &dlg;
  74. dlg.DoModal();
  75. }
  76. OutputDebugString(_T("发送数据成功!\n"));
  77. return true;
  78. }
  79. else
  80. {
  81. g_pDlgProBar = NULL;
  82. OutputDebugString(_T("发送数据失败!\n"));
  83. }
  84. return false;
  85. }
  86. bool CSATClient::OnReceive(const byte* pData, int nLen)
  87. {
  88. // 小于包头;
  89. SATPROTO::DataHeader* phead = NULL;
  90. if (lastData.size() == 0)
  91. {
  92. // 不足包头;
  93. if (PAK_LEN > nLen)
  94. {
  95. OutputDebugString("A:不足包头;\n");
  96. lastData.append((char*)pData, nLen);
  97. }
  98. else
  99. {
  100. // 包头充足;
  101. phead = (SATPROTO::DataHeader*)pData;
  102. // 完整的包;
  103. if (phead->len == nLen)
  104. {
  105. OutputDebugString("A:完整的包;\n");
  106. TaskProcess((SATPROTO::Package*)pData);
  107. }
  108. // 小包;
  109. else if (phead->len > nLen)
  110. {
  111. OutputDebugString("A:小包;\n");
  112. lastData.append((char*)pData, nLen);
  113. }
  114. // 超包;
  115. else if (phead->len < nLen)
  116. {
  117. OutputDebugString("A:超包;\n");
  118. lastData.append((char*)pData + phead->len, nLen - phead->len);
  119. TaskProcess((SATPROTO::Package*)pData);
  120. }
  121. }
  122. }
  123. else
  124. {
  125. int lastlen = nLen;
  126. if (lastData.size() >= PAK_LEN)
  127. {
  128. phead = (SATPROTO::DataHeader*)lastData.data();
  129. if (phead->len <= lastData.size() + nLen)
  130. {
  131. if (phead->len <= lastData.size())
  132. {
  133. OutputDebugString("C:超包;\n");
  134. // 完整包;
  135. TaskProcess((SATPROTO::Package*)lastData.substr(0, phead->len).data());
  136. lastData = lastData.substr(phead->len);
  137. lastData.append((char*)pData, nLen);
  138. }
  139. else
  140. {
  141. OutputDebugString("D:超包;\n");
  142. lastlen = lastData.size() + nLen - phead->len;
  143. lastData.append((char*)pData, nLen - lastlen);
  144. // 完整包;
  145. TaskProcess((SATPROTO::Package*)lastData.data());
  146. // 剩余包;
  147. lastData.clear();
  148. if (lastlen)
  149. lastData.append((char*)pData + nLen - lastlen, lastlen);
  150. }
  151. }
  152. else
  153. {
  154. OutputDebugString("C:仍不足一个包;\n");
  155. lastData.append((char*)pData, nLen);
  156. }
  157. }
  158. else
  159. {
  160. // 包头剩余长度;
  161. int diflen = PAK_LEN - lastData.size();
  162. // 仍不足一个包头;
  163. if (diflen > nLen)
  164. {
  165. OutputDebugString("B:仍不足一个包头;\n");
  166. lastData.append((char*)pData, nLen);
  167. }
  168. else
  169. {
  170. // 拼成完整包头;
  171. lastData.append((char*)pData, diflen);
  172. phead = (SATPROTO::DataHeader*)lastData.data();
  173. // 完整包;
  174. if (phead->len == PAK_LEN + nLen - diflen)
  175. {
  176. OutputDebugString("B:完整包;\n");
  177. lastData.append((char*)pData + diflen, nLen - diflen);
  178. TaskProcess((SATPROTO::Package*)lastData.data());
  179. lastData.clear();
  180. }
  181. // 小包;
  182. else if (phead->len > PAK_LEN + nLen - diflen)
  183. {
  184. OutputDebugString("B:小包;\n");
  185. lastData.append((char*)pData + diflen, nLen - diflen);
  186. }
  187. // 超包;
  188. else if (phead->len < PAK_LEN + nLen - diflen)
  189. {
  190. OutputDebugString("B:超包;\n");
  191. // 组完成包;
  192. lastData.append((char*)pData + diflen, phead->len - PAK_LEN);
  193. TaskProcess((SATPROTO::Package*)lastData.data());
  194. lastData.clear();
  195. int last = nLen - diflen - phead->len + PAK_LEN;
  196. if (last)
  197. {
  198. lastData.append((char*)pData + nLen - last, last);
  199. }
  200. }
  201. }
  202. }
  203. }
  204. return false;
  205. }
  206. bool CSATClient::OnClose()
  207. {
  208. return false;
  209. }
  210. bool CSATClient::OnConnect()
  211. {
  212. return false;
  213. }
  214. void CSATClient::TaskProcess(SATPROTO::Package* pak)
  215. {
  216. SATPROTO::DataHeader* pHeader = &pak->header;
  217. if (pHeader->protocol == 0xAA) {
  218. #ifdef _DEBUG
  219. // 延长加载框显示时间;
  220. Sleep(500);
  221. #endif
  222. if (g_pDlgProBar) {
  223. while (!::IsWindow(g_pDlgProBar->m_hWnd));
  224. g_pDlgProBar->PostMessage(WM_STOPTHREAD);
  225. g_pDlgProBar = NULL;
  226. }
  227. switch (pHeader->cmd)
  228. {
  229. case SATPROTO::CMD_LOGIN:
  230. case SATPROTO::CMD_LOGOUT:
  231. {
  232. SATPROTO::LoginResp* resp = (SATPROTO::LoginResp*)pak->buf;
  233. if (pHeader->cmd == SATPROTO::CMD_LOGIN)
  234. {
  235. SATData::logout_resp.bStatus = false;
  236. SATData::login_resp.bStatus = resp->bStatus;
  237. _stprintf_s(SATData::login_resp.szMessage, _T("%s"), resp->szMessage);
  238. }
  239. else
  240. {
  241. SATData::login_resp.bStatus = false;
  242. SATData::logout_resp.bStatus = resp->bStatus;
  243. _stprintf_s(SATData::logout_resp.szMessage, _T("%s"), resp->szMessage);
  244. }
  245. }
  246. break;
  247. case SATPROTO::CMD_ADD_DEVICE:
  248. case SATPROTO::CMD_DEL_DEVICE:
  249. {
  250. // 无须处理返回值;
  251. }
  252. break;
  253. case SATPROTO::CMD_QUERY_DEVICES:
  254. {
  255. SATPROTO::DeviceResp* resp = (SATPROTO::DeviceResp*)pak->buf;
  256. //SATData::device_resp.nSize = resp->nSize;
  257. //memcpy(SATData::device_resp.szDevs, resp->szDevs, 30*MAX_PATH);
  258. SATData::devices.clear();
  259. for (size_t i = 0; i < resp->nSize; i++)
  260. {
  261. SATPROTO::Device dev;
  262. dev.nType = resp->ssDevs[i].nType;
  263. dev.nStatus = resp->ssDevs[i].nStatus;
  264. memcpy(dev.szName, resp->ssDevs[i].szName, MAX_PATH);
  265. SATData::devices.push_back(dev);
  266. }
  267. }
  268. break;
  269. default:
  270. break;
  271. }
  272. }
  273. }
  274. BOOL CSATClient::Start()
  275. {
  276. int nFamily = (m_nMode == AF_IPV4) ? AF_INET : AF_INET6;
  277. if (!m_SocketClient.StartClient(NULL, Global::g_Config.strServiceIP.c_str(), Global::g_Config.strServicePort.c_str(), nFamily, (m_nSockType + 1)))
  278. {
  279. #ifdef _DEBUG
  280. OutputDebugString("连接服务器失败\n");
  281. #endif
  282. m_bSocket = FALSE;
  283. return FALSE;
  284. }
  285. // 成功连接服务器;
  286. m_bSocket = TRUE;
  287. CSocketHandle* pSH = (CSocketHandle*)m_SocketClient;
  288. // 设置等待数据为0;
  289. pSH->m_nPendingSize = 0;
  290. memset(pSH->m_PendingBuffer, 0, SOCKET_BUFFSIZE);
  291. // 设置多播;
  292. SetupMCAST();
  293. return TRUE;
  294. }
  295. void CSATClient::Stop()
  296. {
  297. m_SocketClient.Terminate();
  298. }
  299. bool CSATClient::SetupMCAST()
  300. {
  301. const TCHAR szIPv4MCAST[] = TEXT("239.121.1.2");
  302. const TCHAR szIPv6MCAST[] = TEXT("FF02:0:0:0:0:0:0:1"); // All Nodes local address
  303. bool result = false;
  304. if (m_nSockType == SOCK_UDP)
  305. {
  306. if (m_nMode == AF_IPV4) {
  307. result = m_SocketClient->AddMembership(szIPv4MCAST, NULL);
  308. }
  309. else {
  310. result = m_SocketClient->AddMembership(szIPv6MCAST, NULL);
  311. HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
  312. hr = hr;
  313. }
  314. }
  315. return result;
  316. }
  317. void CSATClient::GetAddress(const SockAddrIn& addrIn, CString& rString) const
  318. {
  319. TCHAR szIPAddr[MAX_PATH] = { 0 };
  320. CSocketHandle::FormatIP(szIPAddr, MAX_PATH, addrIn);
  321. rString.Format(_T("%s : %d"), szIPAddr, static_cast<int>(static_cast<UINT>(ntohs(addrIn.GetPort()))));
  322. }
  323. bool CSATClient::TCPLogin(std::string strUserName, std::string strPassword, std::string strActuator, BOOL bLogin, BOOL bShowGif )
  324. {
  325. SATData::login_resp = {0};
  326. int len = HEADER_LEN + sizeof(SATPROTO::UserInfo);
  327. byte* pbuff = new byte[len];
  328. memset(pbuff, 0, len);
  329. SATPROTO::Package* pData = (SATPROTO::Package*)pbuff;
  330. pData->header.protocol = 0xAA;
  331. pData->header.len = len;
  332. pData->header.cmd = bLogin ? SATPROTO::CMD_LOGIN : SATPROTO::CMD_LOGOUT;
  333. SATPROTO::UserInfo* pUserInfo = (SATPROTO::UserInfo*)pData->buf;
  334. memcpy(pUserInfo->szUserName, strUserName.c_str(), strUserName.size());
  335. memcpy(pUserInfo->szPassword, strPassword.c_str(), strPassword.size());
  336. memcpy(pUserInfo->szActuatorName, strActuator.c_str(), strActuator.size());
  337. bool bret = OnSend(pbuff, len, bShowGif);
  338. delete[]pbuff;
  339. return bret;
  340. }
  341. bool CSATClient::TCPLogout(std::string strUserName, std::string strPassword, std::string strActuator, BOOL bShowGif)
  342. {
  343. return TCPLogin(strUserName, strPassword, strActuator, FALSE, bShowGif);
  344. }
  345. bool CSATClient::TCPAddDevice(std::string strDevice, bool bDel, BOOL bShowGif)
  346. {
  347. int len = HEADER_LEN + MAX_PATH;
  348. byte* pbuff = new byte[len];
  349. memset(pbuff, 0, len);
  350. SATPROTO::Package* pData = (SATPROTO::Package*)pbuff;
  351. pData->header.protocol = 0xAA;
  352. pData->header.len = len;
  353. pData->header.cmd = bDel ? SATPROTO::CMD_DEL_DEVICE : SATPROTO::CMD_ADD_DEVICE;
  354. // 赋值;
  355. memcpy(pData->buf, strDevice.c_str(), strDevice.size());
  356. bool bret = OnSend(pbuff, len, bShowGif);
  357. delete[]pbuff;
  358. return false;
  359. }
  360. bool CSATClient::TCPDelDevice(std::string strDevice, BOOL bShowGif)
  361. {
  362. return TCPAddDevice(strDevice, false, bShowGif);
  363. }
  364. bool CSATClient::TCPQueryDevices(BOOL bShowGif)
  365. {
  366. int len = HEADER_LEN;
  367. byte* pbuff = new byte[len];
  368. memset(pbuff, 0, len);
  369. SATPROTO::Package* pData = (SATPROTO::Package*)pbuff;
  370. pData->header.protocol = 0xAA;
  371. pData->header.len = len;
  372. pData->header.cmd = SATPROTO::CMD_QUERY_DEVICES;
  373. bool bret = OnSend(pbuff, len, bShowGif);
  374. delete[]pbuff;
  375. return false;
  376. }