SATClient.cpp 11 KB

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