ServerSocket.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963
  1. #include "stdafx.h"
  2. #include ".\serversocket.h"
  3. //#include "stdafx.h"
  4. #include <comdef.h>
  5. #include <atlbase.h>
  6. //#include "resource.h"
  7. //#include "AboutBox.h"
  8. #include "ThreadPool.hpp"
  9. #include <strsafe.h>
  10. #include "SysLib.h"
  11. #include "ascprocess.h"
  12. #include "VarProcess.h"
  13. #include "rtuprocess.h"
  14. const int SOCK_TCP = SOCK_STREAM-1;
  15. const int SOCK_UDP = SOCK_DGRAM-1;
  16. const int AF_IPV4 = 0;
  17. const int AF_IPV6 = 1;
  18. CServerSocket::CServerSocket(void)
  19. {
  20. m_nSockType = SOCK_TCP;
  21. m_nMode = AF_IPV4;
  22. m_SocketServer.SetInterface(this);
  23. }
  24. CServerSocket::~CServerSocket(void)
  25. {
  26. }
  27. ///////////////////////////////////////////////////////////////////////////////
  28. void CServerSocket::OnThreadBegin(CSocketHandle* pSH)
  29. {
  30. ASSERT( pSH == m_SocketServer );
  31. (pSH);
  32. CString strAddr;
  33. SockAddrIn sockAddr;
  34. m_SocketServer->GetSockName(sockAddr);
  35. GetAddress( sockAddr, strAddr );
  36. // AppendText( _T("Server Running on: %s\r\n"), strAddr);
  37. }
  38. void CServerSocket::OnThreadExit(CSocketHandle* pSH)
  39. {
  40. ASSERT( pSH == m_SocketServer );
  41. (pSH);
  42. //AppendText( _T("Server Down!\r\n"));
  43. }
  44. void CServerSocket::OnConnectionFailure(CSocketHandle* pSH, SOCKET newSocket)
  45. {
  46. ASSERT( pSH == m_SocketServer );
  47. (pSH);
  48. CString strAddr;
  49. CSocketHandle sockHandle;
  50. SockAddrIn sockAddr;
  51. if (newSocket != INVALID_SOCKET)
  52. {
  53. sockHandle.Attach( newSocket );
  54. sockHandle.GetPeerName( sockAddr );
  55. GetAddress( sockAddr, strAddr );
  56. sockHandle.Close();
  57. // AppendText( _T("Connection abandoned: %s\r\n"), strAddr );
  58. }
  59. else
  60. {
  61. ;//AppendText( _T("Connection abandoned. Not a valid socket.\r\n"), strAddr );
  62. }
  63. }
  64. void CServerSocket::OnAddConnection(CSocketHandle* pSH, SOCKET newSocket)
  65. {
  66. ASSERT( pSH == m_SocketServer );
  67. (pSH);
  68. CString strAddr;
  69. CSocketHandle sockHandle;
  70. SockAddrIn sockAddr;
  71. sockHandle.Attach( newSocket );
  72. sockHandle.GetPeerName( sockAddr );
  73. GetAddress( sockAddr, strAddr );
  74. sockHandle.Detach();
  75. //AppendText( _T("Connection established: %s\r\n"), strAddr );
  76. }
  77. void CServerSocket::OnDataReceived(CSocketHandle* pSH, const BYTE* pbData, DWORD dwCount, const SockAddrIn& addr)
  78. {
  79. ASSERT( pSH == m_SocketServer );
  80. (pSH);
  81. //CString strAddr, strText;
  82. //USES_CONVERSION;
  83. //LPTSTR pszText = strText.GetBuffer(dwCount+1);
  84. //::StringCchCopyN(pszText, dwCount+1, A2CT(reinterpret_cast<LPCSTR>(pbData)), dwCount);
  85. //strText.ReleaseBuffer();
  86. //GetAddress( addr, strAddr );
  87. //int nBuffIndex = 0;
  88. ////while (nBuffIndex<dwCount)
  89. ////{
  90. // ProtocolHeader *pHeader;// = (ProtocolHeader *)(char *)pszText;
  91. // pHeader = ( ProtocolHeader* )&( ( unsigned char * )pbData )[ 0 ];
  92. //nBuffIndex++;
  93. //memcpy(*pHeader, (char *)pbData, dwCount);
  94. //}
  95. // memcpy(&Header, pbData, sizeof(ProtocolHeader));
  96. //TRACE("recv pack len = %d\r\n", dwCount);
  97. CSocketHandle sockHandle;
  98. InitializeCriticalSection(&sockHandle.m_hClient2SrvSection);
  99. sockHandle.m_nPendingSize = 0;
  100. memset(sockHandle.m_PendingBuffer, 0, SOCKET_BUFFSIZE);
  101. BOOL bFind = FALSE;
  102. bFind = GetClientSocketHandle( sockHandle, addr );
  103. //OnCmdProcess( addr, pData, nLen );
  104. if( bFind )
  105. {
  106. ProcessData( sockHandle, pbData, dwCount );
  107. sockHandle.Detach();
  108. }
  109. DeleteCriticalSection(&sockHandle.m_hClient2SrvSection);
  110. }
  111. void CServerSocket::OnConnectionDropped(CSocketHandle* pSH)
  112. {
  113. ASSERT( pSH == m_SocketServer );
  114. (pSH);
  115. // AppendText( _T("Connection lost with client.\r\n") );
  116. }
  117. void CServerSocket::OnConnectionError(CSocketHandle* pSH, DWORD dwError)
  118. {
  119. ASSERT( pSH == m_SocketServer );
  120. (pSH);
  121. _com_error err(dwError);
  122. //AppendText( _T("Communication Error:\r\n%s\r\n"), err.ErrorMessage() );
  123. }
  124. int CServerSocket::OnCmdProcess(CSocketHandle &sockHandle, void *pData)
  125. {
  126. ProtocolHeader *pHeader = (ProtocolHeader *)pData;
  127. /*TRACE2("pack len = %d, pack cmd = %d\r\n", pHeader->nLen, pHeader->nCmd);
  128. unsigned int tmp = CalcCheckSum(pHeader, pHeader->nLen);
  129. if(tmp != pHeader->Verify)
  130. {
  131. return -1;
  132. }*/
  133. switch (pHeader->nCmd)
  134. {
  135. case CMD_DEV_ONLINE: //读设备在线状态
  136. ProcessResDevOnline(sockHandle, pHeader);
  137. //ProcessResDevOnline(s, pHeader);
  138. break;
  139. case CMD_SINGLE_VAR_ONLINE: //读单个变量在线状态命令
  140. ProcessResSingleVarOnline(sockHandle, pHeader);
  141. break;
  142. case CMD_MUL_VAR_ONLINE: //读多个变量在线状态命令
  143. ProcessResMulVarOnline(sockHandle, pHeader);
  144. break;
  145. case CMD_READ_SINGLE_VAR_DATA: //读单个变量内容或报警状态
  146. ProcessResReadSingleVarData(sockHandle, pHeader);
  147. break;
  148. case CMD_READ_MUL_VAR_DATA: //读多个变量内容或报警状态
  149. ProcessResReadMulVarData(sockHandle, pHeader);
  150. break;
  151. case CMD_WRITE_SINGLE_VAR_DATA: //设置单个变量值
  152. ProcessResWriteSingleVarData(sockHandle, pHeader);
  153. break;
  154. case CMD_WRITE_MUL_VAR_DATA: //设置多个变量值
  155. PrcocessResWriteMulVarData(sockHandle, pHeader);
  156. break;
  157. case CMD_DOG_DATA: //软件狗数据
  158. ProcessResSoftDog(sockHandle, pHeader);
  159. break;
  160. case CMD_ALARM_CONFIRM: //读报警确认数据
  161. ProcessResAlarmConfirm(sockHandle, pHeader);
  162. break;
  163. //请求读特殊变量的数据
  164. case CMD_READ_SPECIAL_SINGLE_VAR_DATA:
  165. ProcessResReadSpecSingleVarData(sockHandle, pHeader);
  166. default: return 0;
  167. }
  168. return 0;
  169. }
  170. BOOL CServerSocket::GetClientSocketHandle(CSocketHandle &sockHandle, const SockAddrIn &addr)
  171. {
  172. BOOL bFind = FALSE;
  173. if ( m_SocketServer.IsOpen() )
  174. {
  175. USES_CONVERSION;
  176. if (m_nSockType == SOCK_TCP)
  177. {
  178. // unsafe access to Socket list!
  179. #ifdef SOCKHANDLE_USE_OVERLAPPED
  180. const SocketBufferList& sl = m_SocketServer.GetSocketList();
  181. for(SocketBufferList::const_iterator citer = sl.begin(); citer != sl.end(); ++citer)
  182. #else
  183. const SocketList& sl = m_SocketServer.GetSocketList();
  184. for(SocketList::const_iterator citer = sl.begin(); citer != sl.end(); ++citer)
  185. #endif
  186. {
  187. sockHandle.Attach( (*citer) );
  188. SockAddrIn sockAddr;
  189. sockHandle.GetPeerName(sockAddr);
  190. if( sockAddr == addr )
  191. {
  192. bFind = TRUE;
  193. }
  194. }
  195. }
  196. }
  197. return bFind;
  198. }
  199. void CServerSocket::ProcessData(CSocketHandle &sockHandle, const BYTE* pData, DWORD nLen)
  200. {
  201. DWORD nBuffIndex = 0;
  202. EnterCriticalSection( &(sockHandle.m_hClient2SrvSection) );
  203. while( nBuffIndex < nLen )
  204. {
  205. ProtocolHeader *pHeader; //当前协议包头
  206. DWORD nProcessedLen = 0; //当前循环处理了多少个字节
  207. if( sockHandle.m_nPendingSize > 0 ) // 开始组包
  208. {
  209. pHeader = (ProtocolHeader *)sockHandle.m_PendingBuffer;
  210. if( sockHandle.m_nPendingSize < sizeof(ProtocolHeader) ) //上一次接收到的长度小于包头
  211. {
  212. DWORD nLinkHeaderLen = sizeof( ProtocolHeader ) - sockHandle.m_nPendingSize;
  213. if( nLinkHeaderLen <= nLen ) //这次可以收完包头
  214. {
  215. memcpy( &sockHandle.m_PendingBuffer[ sockHandle.m_nPendingSize ], pData, nLinkHeaderLen ); //这里已经收完Header
  216. nProcessedLen = pHeader->nLen - sockHandle.m_nPendingSize;
  217. if( nProcessedLen <= nLen ) //如果所需处理的长度小于等于当前包长度
  218. {
  219. memcpy( &sockHandle.m_PendingBuffer[ sizeof( ProtocolHeader ) ],
  220. & ( ( char *) pData )[ nLinkHeaderLen ],
  221. pHeader->nLen - sizeof( ProtocolHeader ) );
  222. sockHandle.m_nPendingSize = 0; // 收完所需的包,置m_nPendingSize为0
  223. }
  224. else
  225. {
  226. int nTemp = nLen - nLinkHeaderLen; //除去头剩余部分的长度
  227. if ( nTemp > 0 ) //刚好是Header的长度,不用拷贝内存,所以这里加了>0的判断
  228. {
  229. memcpy( &sockHandle.m_PendingBuffer[ sizeof( ProtocolHeader ) ],
  230. & ( ( char *) pData )[ nLinkHeaderLen ],
  231. nTemp );
  232. }
  233. sockHandle.m_nPendingSize += nLen;
  234. }
  235. }
  236. else //这次还是没有收完包头, 继续Pending
  237. {
  238. memcpy( &sockHandle.m_PendingBuffer[ sockHandle.m_nPendingSize ], pData, nLen );
  239. sockHandle.m_nPendingSize += nLen;
  240. nProcessedLen = nLen;
  241. }
  242. }
  243. else //Header部分已经在阻塞的缓冲区中
  244. {
  245. nProcessedLen = pHeader->nLen - sockHandle.m_nPendingSize;
  246. if ( nProcessedLen <= nLen ) //如果需要处理的长度小于现有包的长度
  247. {
  248. memcpy( &sockHandle.m_PendingBuffer[ sockHandle.m_nPendingSize ], pData, nProcessedLen );
  249. sockHandle.m_nPendingSize = 0;
  250. }
  251. else //否则要继续阻塞
  252. {
  253. memcpy( &sockHandle.m_PendingBuffer[ sockHandle.m_nPendingSize ], pData, nLen );
  254. sockHandle.m_nPendingSize += nLen;
  255. }
  256. }
  257. }
  258. else //第一次接包
  259. {
  260. pHeader = (ProtocolHeader *)&( (unsigned char *)pData )[nBuffIndex];
  261. if( nLen - nBuffIndex < sizeof(ProtocolHeader) ) // 没有收够包头,先记录当前收到的Buffer
  262. {
  263. //如果第一次接包就没有收够包头,认为是非法包,扔掉,就是说已处理的长度nProcessedLen = 0
  264. sockHandle.m_nPendingSize = nLen - nBuffIndex;
  265. memcpy(sockHandle.m_PendingBuffer, pHeader, sockHandle.m_nPendingSize);
  266. }
  267. else
  268. {
  269. nProcessedLen = pHeader->nLen;
  270. if( (int)pHeader->nLen > nLen - nBuffIndex )
  271. {
  272. memcpy(sockHandle.m_PendingBuffer, pHeader, nLen - nBuffIndex);
  273. //如果第一次接包,pHeader->nLen大于当前包的总长,认为是非法包,扔掉
  274. if( nBuffIndex = 0 )
  275. {
  276. //组包错误,则扔掉当前包
  277. TRACE("pHeader->nLen大于当前包的总长,认为是非法包,扔掉\r\n");
  278. break;
  279. }
  280. sockHandle.m_nPendingSize = nLen - nBuffIndex;
  281. nProcessedLen = nLen - nBuffIndex;
  282. }
  283. else
  284. {
  285. sockHandle.m_nPendingSize = 0;
  286. }
  287. }
  288. }
  289. if ( nProcessedLen == 0 )
  290. {
  291. // 没有收够包头,认为是非法包,扔掉
  292. TRACE("没有收够包头,认为是非法包,扔掉\r\n");
  293. break;
  294. }
  295. if ( sockHandle.m_nPendingSize == 0 )
  296. {
  297. if ( pHeader->nLen > SOCKET_BUFFSIZE )
  298. {
  299. // 包长度超过限制
  300. TRACE("pHeader->nLen超过限制\r\n");
  301. }
  302. if(-1 == OnCmdProcess( sockHandle, pHeader ))
  303. {
  304. //MessageBox( NULL, "Error OnCmdProcess", NULL, MB_OK );
  305. TRACE("crc校验错误!\r\n");
  306. break;
  307. }
  308. }
  309. nBuffIndex += nProcessedLen;
  310. }
  311. LeaveCriticalSection( &(sockHandle.m_hClient2SrvSection) );
  312. }
  313. void CServerSocket::SocketStop()
  314. {
  315. m_SocketServer.Terminate();
  316. }
  317. int CServerSocket::SvrStart(CString strPort)
  318. {
  319. int nFamily = (m_nMode == AF_IPV4) ? AF_INET : AF_INET6;
  320. if (!m_SocketServer.StartServer(NULL, strPort, nFamily, (m_nSockType+1) ))
  321. {
  322. ;//MessageBox(NULL,_T("Failed to start server."), NULL, MB_ICONSTOP);
  323. };
  324. return 0;
  325. }
  326. bool CServerSocket::GetDestination(SockAddrIn& addrIn) const
  327. {
  328. CString strPort;
  329. //GetDlgItemText(IDC_SVR_PORT, strPort);
  330. int nFamily = (m_nMode == AF_IPV4) ? AF_INET : AF_INET6;
  331. return addrIn.CreateFrom(NULL, strPort, nFamily);
  332. }
  333. void CServerSocket::SocketSend(CSocketHandle &sockHandle, unsigned char *pMsg, int iLength)
  334. {
  335. if ( m_SocketServer.IsOpen() )
  336. {
  337. USES_CONVERSION;
  338. if (m_nSockType == SOCK_TCP)
  339. {
  340. // unsafe access to Socket list!
  341. const LPBYTE lpbData = (const LPBYTE)(pMsg);
  342. sockHandle.Write(lpbData, iLength, NULL);
  343. }
  344. else
  345. {
  346. SockAddrIn servAddr, sockAddr;
  347. m_SocketServer->GetSockName(servAddr);
  348. GetDestination(sockAddr);
  349. if ( servAddr != sockAddr ) {
  350. m_SocketServer.Write((const LPBYTE)*pMsg, iLength, sockAddr);
  351. } else {
  352. //AppendText( _T("Please change the port number to send message to a client.\r\n") );
  353. }
  354. }
  355. }
  356. else
  357. {
  358. ;//MessageBox(NULL,_T("Socket is not connected"), "TEST", MB_ICONSTOP);
  359. }
  360. }
  361. void CServerSocket::GetAddress(const SockAddrIn& addrIn, CString& rString) const
  362. {
  363. TCHAR szIPAddr[MAX_PATH] = { 0 };
  364. CSocketHandle::FormatIP(szIPAddr, MAX_PATH, addrIn);
  365. rString.Format(_T("%s : %d"), szIPAddr, static_cast<int>(static_cast<UINT>(ntohs(addrIn.GetPort()))) );
  366. }
  367. int CServerSocket::ProcessResDevOnline(CSocketHandle &sockHandle, void *pBuffer)
  368. {
  369. DevOnline *tmpDevOnline = (DevOnline *)pBuffer;
  370. ReqDevOnline tmpReqline = {0};
  371. tmpReqline.Header.nCmd = tmpDevOnline->Header.nCmd;
  372. tmpReqline.Header.nCmdType = tmpDevOnline->Header.nCmdType;
  373. memcpy(&tmpReqline.DevUid, tmpDevOnline->DevUid, sizeof(tmpDevOnline->DevUid));
  374. tmpReqline.nOnline = 0;
  375. tmpReqline.nStatus = 0;
  376. tmpReqline.Header.Verify = 0;
  377. tmpReqline.Header.nLen = 44;
  378. int nSendLen = tmpReqline.Header.nLen;
  379. tmpReqline.Header.Verify = CalcCheckSum( &tmpReqline, nSendLen );
  380. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)&tmpReqline, nSendLen);
  381. return 0;
  382. }
  383. //单个变量应答设备在线状态
  384. int CServerSocket::ProcessResSingleVarOnline(CSocketHandle &sockHandle, void *pBuffer)
  385. {
  386. SingleVarOnline *tmpSnVarline = (SingleVarOnline *)pBuffer;
  387. ReqSingleVarOnline tmpReqSnVarline;
  388. memset(&tmpReqSnVarline, 0, sizeof(ReqSingleVarOnline) );
  389. tmpReqSnVarline.Header.nCmd = tmpSnVarline->Header.nCmd;
  390. tmpReqSnVarline.Header.nCmdType = tmpSnVarline->Header.nCmdType;
  391. memcpy(&tmpReqSnVarline.DevUid, tmpSnVarline->DevUid, sizeof(tmpSnVarline->DevUid));
  392. tmpReqSnVarline.DevChildVar.nOnline = 0x01;
  393. tmpReqSnVarline.DevChildVar.nStatus = 0x02;
  394. //memcpy(tmpReqSnVarline.DevChildVar.pVarUid, tmpSnVarline->VarUid, sizeof(tmpSnVarline->VarUid));
  395. tmpReqSnVarline.DevChildVar.iVarid = tmpSnVarline->iVarid;
  396. tmpReqSnVarline.Header.Verify = 0;
  397. tmpReqSnVarline.Header.nLen = sizeof(ReqSingleVarOnline);
  398. int nSendLen = tmpReqSnVarline.Header.nLen;
  399. tmpReqSnVarline.Header.Verify = CalcCheckSum( &tmpReqSnVarline, nSendLen );
  400. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)&tmpReqSnVarline, nSendLen);
  401. return 0;
  402. }
  403. //应答多个变量在线状态
  404. int CServerSocket::ProcessResMulVarOnline(CSocketHandle &sockHandle, void *pBuffer)
  405. {
  406. char *pResBuffer = NULL;
  407. char *pVarUid = NULL;
  408. char *pDataBuffer =(char *)pBuffer;
  409. vector<ChildVar> vChildVar;
  410. ChildVar tmpChildVar={0};
  411. //取数据的包头,设备UID,变量的数量
  412. MulVarOnline tmpMulVarline = {0};
  413. memcpy(&tmpMulVarline, pDataBuffer, sizeof(MulVarOnline));
  414. //所有变量的ID的长度
  415. int iVarUidsLen = tmpMulVarline.nVarSum * sizeof(tmpChildVar.iVarid);
  416. pVarUid = new char[iVarUidsLen];
  417. //取所有变量的ID
  418. memcpy(pVarUid,( pDataBuffer + sizeof(MulVarOnline)), iVarUidsLen);
  419. for(int i = 0; i< tmpMulVarline.nVarSum; i++)
  420. {
  421. memcpy(&tmpChildVar.iVarid, pVarUid + i*sizeof(tmpChildVar.iVarid), sizeof(tmpChildVar.iVarid));
  422. tmpChildVar.nOnline = 1;
  423. tmpChildVar.nStatus = 2;
  424. vChildVar.push_back(tmpChildVar);
  425. }
  426. //求发送的应答数据包长度
  427. int nSendLen = tmpMulVarline.Header.nLen +
  428. tmpMulVarline.nVarSum *(sizeof(tmpChildVar.nStatus) +
  429. sizeof(tmpChildVar.nOnline));
  430. tmpMulVarline.Header.Verify = 0;
  431. tmpMulVarline.Header.nLen = nSendLen;
  432. pResBuffer = new char[nSendLen];
  433. //求校验位
  434. memcpy(pResBuffer, (char *)&tmpMulVarline, sizeof(MulVarOnline));
  435. for(int i = 0; i< tmpMulVarline.nVarSum; i++)
  436. memcpy(pResBuffer + sizeof(MulVarOnline) + i*sizeof(ChildVar), &vChildVar[i], sizeof(ChildVar));
  437. tmpMulVarline.Header.Verify = CalcCheckSum( &pResBuffer, nSendLen );
  438. //发送应答数据包
  439. memset(pResBuffer, 0, nSendLen);
  440. memcpy(pResBuffer, (char *)&tmpMulVarline, sizeof(MulVarOnline));
  441. for(int i = 0; i< tmpMulVarline.nVarSum; i++)
  442. memcpy(pResBuffer + sizeof(MulVarOnline) + i*sizeof(ChildVar), &vChildVar[i], sizeof(ChildVar));
  443. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)pResBuffer, nSendLen);
  444. delete []pResBuffer;
  445. delete []pVarUid;
  446. return 0;
  447. }
  448. //读单个变量内容或报警状态
  449. int CServerSocket::ProcessResReadSingleVarData(CSocketHandle &sockHandle, void *pBuffer)
  450. {
  451. ReadSingleVarData *pReadSnVar = (ReadSingleVarData *)pBuffer;
  452. ReqSingleVarData tmpReqSnVar;
  453. memset(&tmpReqSnVar, 0, sizeof(ReqSingleVarData));
  454. tmpReqSnVar.Header.nCmd = pReadSnVar->Header.nCmd;
  455. tmpReqSnVar.Header.nCmdType = pReadSnVar->Header.nCmdType;
  456. memcpy(tmpReqSnVar.DevUid, pReadSnVar->DevUid, sizeof(pReadSnVar->DevUid));
  457. tmpReqSnVar.VarData.iVarid = pReadSnVar->iVarid;
  458. memset(&g_ReadOneData, 0, sizeof(READDEVREALDATA));
  459. SETBASEPARAM SetBasePara;
  460. char chDataLen[4] = {0};
  461. char chPort[4] = {0};
  462. char chAddr[4] = {0};
  463. char chSpecialdevice[2] = {0};
  464. GetOneVarProerty((char*)pReadSnVar->DevUid, pReadSnVar->iVarid,
  465. &SetBasePara, chDataLen, chPort, chAddr,chSpecialdevice);
  466. if (atoi(chSpecialdevice) == 0)
  467. {
  468. if (RtuRequestData(SetBasePara, chDataLen, chPort, chAddr)==0)
  469. RtuSingleResponseData((char*)pReadSnVar->DevUid, pReadSnVar->iVarid);
  470. else
  471. return -1;
  472. }
  473. else if (atoi(chSpecialdevice) == 1)
  474. {
  475. if (RequestData(SetBasePara, chDataLen, chPort, chAddr) == 0)
  476. {
  477. int nRet = SingleResponseData((char*)pReadSnVar->DevUid, pReadSnVar->iVarid);
  478. if( nRet != 0 )
  479. {
  480. return nRet;
  481. }
  482. }
  483. else
  484. {
  485. return ERR_CODE_MODBUS_ASC_COM_READ_NO_DATA;
  486. }
  487. }
  488. tmpReqSnVar.VarData.nStatus = g_ReadOneData.iStatus;
  489. tmpReqSnVar.VarData.Data = g_ReadOneData.dbData;
  490. tmpReqSnVar.Header.Verify = 0;
  491. tmpReqSnVar.Header.nLen = sizeof(ReqSingleVarData);
  492. int nSendLen = tmpReqSnVar.Header.nLen;
  493. tmpReqSnVar.Header.Verify = CalcCheckSum( &tmpReqSnVar, nSendLen );
  494. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)&tmpReqSnVar, nSendLen);
  495. return 0;
  496. }
  497. //读多个变量内容或报警状态
  498. int CServerSocket::ProcessResReadMulVarData(CSocketHandle &sockHandle, void *pBuffer)
  499. {
  500. char* pResBuffer =NULL;
  501. MulVarData tmpMulVarData = {0};
  502. vector<ChildVarData> vChild_varData;
  503. ChildVarData tmpchildData = {0};
  504. char* pDataBuff = (char*)pBuffer;
  505. memcpy(&tmpMulVarData, pDataBuff, sizeof(MulVarData));
  506. //取所有变量的ID
  507. for(int i =0; i< tmpMulVarData.nVarSum; i++)
  508. {
  509. int iPos = sizeof(MulVarData) +i*sizeof(tmpchildData.iVarid);
  510. memcpy(&tmpchildData.iVarid, pDataBuff + iPos, sizeof(tmpchildData.iVarid));
  511. memset(&g_ReadOneData, 0, sizeof(READDEVREALDATA));
  512. SETBASEPARAM SetBasePara;
  513. char chDataLen[4] = {0};
  514. char chPort[4] = {0};
  515. char chAddr[4] = {0};
  516. char chSpecialdevice[2] = {0};
  517. GetOneVarProerty((char*)tmpMulVarData.DevUid, tmpchildData.iVarid, &SetBasePara,
  518. chDataLen, chPort, chAddr, chSpecialdevice);
  519. if (atoi(chSpecialdevice) == 0)
  520. {
  521. if (RtuRequestData(SetBasePara, chDataLen, chPort, chAddr)==0)
  522. RtuSingleResponseData((char*)tmpMulVarData.DevUid, tmpchildData.iVarid);
  523. else
  524. return -1;
  525. }
  526. else if (atoi(chSpecialdevice) == 1)
  527. {
  528. if (RequestData(SetBasePara, chDataLen, chPort, chAddr)==0)
  529. SingleResponseData((char*)tmpMulVarData.DevUid, tmpchildData.iVarid);
  530. else
  531. return -1;
  532. }
  533. tmpchildData.Data = g_ReadOneData.dbData;//2.2;
  534. tmpchildData.nStatus = g_ReadOneData.iStatus;
  535. vChild_varData.push_back(tmpchildData);
  536. }
  537. //求发送的应答数据包长度
  538. int nSendLen = tmpMulVarData.Header.nLen +
  539. tmpMulVarData.nVarSum *(sizeof(tmpchildData.nStatus) +
  540. sizeof(tmpchildData.Data));
  541. tmpMulVarData.Header.Verify = 0;
  542. tmpMulVarData.Header.nLen = nSendLen;
  543. pResBuffer = new char[nSendLen];
  544. //求校验位
  545. memcpy(pResBuffer, (char *)&tmpMulVarData, sizeof(MulVarData));
  546. for(int i = 0; i< tmpMulVarData.nVarSum; i++)
  547. memcpy(pResBuffer + sizeof(MulVarData) + i*sizeof(ChildVarData), &vChild_varData[i], sizeof(ChildVarData));
  548. tmpMulVarData.Header.Verify = CalcCheckSum( &pResBuffer, nSendLen );
  549. //发送应答数据包
  550. memset(pResBuffer, 0, nSendLen);
  551. memcpy(pResBuffer, (char *)&tmpMulVarData, sizeof(MulVarData));
  552. for(int i = 0; i< tmpMulVarData.nVarSum; i++)
  553. memcpy(pResBuffer + sizeof(MulVarData) + i*sizeof(ChildVarData), &vChild_varData[i], sizeof(ChildVarData));
  554. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)pResBuffer, nSendLen);
  555. delete []pResBuffer;
  556. return 0;
  557. }
  558. //设置单个变量值
  559. int CServerSocket::ProcessResWriteSingleVarData(CSocketHandle &sockHandle, void *pBuffer)
  560. {
  561. //30 00 00 00 0E 00 00 00 00 00 00 00 00 00 00 00 31 2E 31 2E 31 2E 31
  562. //00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 9A 99 99 99 99 99 01 40
  563. WrSingleVarData *pWrSnVarData = (WrSingleVarData*)pBuffer;//请求数据包
  564. ReqWrSingleVarData tmpReqWrSnVar;//应答数据包
  565. //设置命令、命令类型、设备UID、变量UID
  566. memset(&tmpReqWrSnVar, 0, sizeof(ReqWrSingleVarData));
  567. tmpReqWrSnVar.Header.nCmd = pWrSnVarData->Header.nCmd;
  568. tmpReqWrSnVar.Header.nCmdType = pWrSnVarData->Header.nCmdType;
  569. memcpy(tmpReqWrSnVar.DevUid, pWrSnVarData->DevUid, sizeof(pWrSnVarData->DevUid));
  570. tmpReqWrSnVar.ReqVarData.iVarid = pWrSnVarData->VarData.iVarid;
  571. //memcpy(tmpReqWrSnVar.ReqVarData.iVarid, pWrSnVarData->VarData.iVarid, sizeof(pWrSnVarData->VarData.VarUid));
  572. //pWrSnVarData->VarData.Data = 13.5;
  573. //g_ReadOneData.dbData = pWrSnVarData->VarData.Data;//数据
  574. //char tmpdata[4] = {'0','1','0','3'};
  575. //pWrSnVarData->VarData.Data = atof(tmpdata);
  576. memset(&g_ReadOneData, 0, sizeof(READDEVREALDATA));
  577. if (RequestWrData((char*)tmpReqWrSnVar.DevUid,
  578. tmpReqWrSnVar.ReqVarData.iVarid, pWrSnVarData->VarData.Data) == 0)
  579. {
  580. SingleResponseWriteData((char*)tmpReqWrSnVar.DevUid,tmpReqWrSnVar.ReqVarData.iVarid);
  581. if (g_ReadOneData.dbData != pWrSnVarData->VarData.Data)//判断设置数据是否一致
  582. tmpReqWrSnVar.ReqVarData.nStatus = -1;
  583. }
  584. else
  585. {
  586. tmpReqWrSnVar.ReqVarData.nStatus = -1;
  587. }
  588. tmpReqWrSnVar.Header.Verify = 0;//校验码
  589. tmpReqWrSnVar.Header.nLen = sizeof(ReqWrSingleVarData);//数据包长度
  590. int nSendLen = tmpReqWrSnVar.Header.nLen;
  591. tmpReqWrSnVar.Header.Verify = CalcCheckSum( &tmpReqWrSnVar, nSendLen );//进行校验
  592. //通过COM232设置变量值
  593. //pWrSnVarData->VarData.Data
  594. //........
  595. //SendMsgToClient(s, &tmpReqWrSnVar, nSendLen);//发送命令包
  596. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)&tmpReqWrSnVar, nSendLen);
  597. return 0;
  598. }
  599. int CServerSocket::PrcocessResWriteMulVarData(CSocketHandle &sockHandle, void *pBuffer)
  600. {
  601. char* pResBuffer = NULL;
  602. WrMulVarData tmpWrMulVarData = {0};
  603. vector <ChildWrVarData> vChildWrData;
  604. vector <ChildReqWrVarData> vChildReqWrVarData;
  605. ChildWrVarData tmpChildvarData = {0};
  606. ChildReqWrVarData tmpChildReqVarData = {0};
  607. char* pDataBuffer = (char*)pBuffer;
  608. memset(&tmpWrMulVarData, 0, sizeof(WrMulVarData));
  609. memcpy(&tmpWrMulVarData, pDataBuffer, sizeof(WrMulVarData));
  610. ASSERT(tmpWrMulVarData.nVarSum > 0);
  611. for(int i=0; i< tmpWrMulVarData.nVarSum; i++)
  612. {
  613. int iPos = sizeof(WrMulVarData) + i*sizeof(ChildWrVarData);
  614. memcpy(&tmpChildvarData, pDataBuffer + iPos, sizeof(ChildWrVarData));
  615. tmpChildReqVarData.iVarid = tmpChildvarData.iVarid;
  616. //memcpy(&tmpChildReqVarData.VarUid, tmpChildvarData.VarUid, sizeof(tmpChildvarData.VarUid));
  617. tmpChildReqVarData.nStatus = 1;
  618. vChildWrData.push_back(tmpChildvarData);
  619. vChildReqWrVarData.push_back(tmpChildReqVarData);
  620. }
  621. //包长度
  622. int nSendLen = sizeof(WrMulVarData) + tmpWrMulVarData.nVarSum *(sizeof(tmpChildReqVarData.nStatus) +
  623. sizeof(tmpChildReqVarData.iVarid));
  624. tmpWrMulVarData.Header.nLen = nSendLen;
  625. pResBuffer = new char[nSendLen];
  626. //求校验位
  627. memcpy(pResBuffer, (char *)&tmpWrMulVarData, sizeof(WrMulVarData));
  628. for(int i = 0; i< tmpWrMulVarData.nVarSum; i++)
  629. {
  630. int iPos = sizeof(WrMulVarData) + i*sizeof(ChildReqWrVarData);
  631. memcpy(pResBuffer + iPos, &vChildReqWrVarData[i], sizeof(ChildReqWrVarData));
  632. }
  633. tmpWrMulVarData.Header.Verify = CalcCheckSum( &pResBuffer, nSendLen );
  634. //发送应答数据包
  635. memset(pResBuffer, 0, nSendLen);
  636. memcpy(pResBuffer, (char *)&tmpWrMulVarData, sizeof(WrMulVarData));
  637. for(int i = 0; i< tmpWrMulVarData.nVarSum; i++)
  638. {
  639. int iPos = sizeof(WrMulVarData) + i*sizeof(ChildReqWrVarData);
  640. memcpy(pResBuffer + iPos, &vChildReqWrVarData[i], sizeof(ChildReqWrVarData));
  641. }
  642. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)pResBuffer, nSendLen);
  643. delete []pResBuffer;
  644. return 0;
  645. }
  646. int CServerSocket::ProcessResSoftDog(CSocketHandle &sockHandle, void *pBuffer)
  647. {
  648. //char* pResBuffer = NULL;
  649. //char *pDevUid = NULL;
  650. //char *pDataBuffer =(char *)pBuffer;
  651. //Dog_Data tmpDogData = {0};
  652. //ReqDogData tmpReqDogData = {0};
  653. //vector <ChildDogData> vChildDog;
  654. //ChildDogData tmpChildDog;
  655. //memcpy(&tmpDogData, pDataBuffer, sizeof(Dog_Data));
  656. //for (int i=0; i<tmpDogData.nDevSum; i++)
  657. //{
  658. // memcpy(tmpChildDog.DevUid, pDataBuffer, );
  659. //}
  660. return 0;
  661. }
  662. int CServerSocket::ProcessResAlarmConfirm(CSocketHandle &sockHandle, void *pBuffer)
  663. {
  664. AlarmConfirm *tmpaLarmConfirm = (AlarmConfirm *) pBuffer;
  665. ReqAlarmConfirm tmpReqAlarmConfirm = {0};
  666. tmpReqAlarmConfirm.Header.nCmd = tmpaLarmConfirm->Header.nCmd;
  667. tmpReqAlarmConfirm.Header.nCmdType = tmpaLarmConfirm->Header.nCmdType;
  668. memcpy(&tmpReqAlarmConfirm.DevUid, tmpaLarmConfirm->DevUid, sizeof(tmpaLarmConfirm->DevUid));
  669. tmpReqAlarmConfirm.iVarid = tmpaLarmConfirm->iVarid;
  670. //memcpy(&tmpReqAlarmConfirm.VarUid, tmpaLarmConfirm->VarUid, sizeof(tmpaLarmConfirm->VarUid));
  671. tmpReqAlarmConfirm.nStauts = 1;
  672. tmpReqAlarmConfirm.Header.nLen = sizeof(ReqAlarmConfirm);
  673. tmpReqAlarmConfirm.Header.Verify = CalcCheckSum(&tmpReqAlarmConfirm, tmpReqAlarmConfirm.Header.nLen);
  674. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)&tmpReqAlarmConfirm, tmpReqAlarmConfirm.Header.nLen);
  675. return 0;
  676. }
  677. //请求读特殊变量的数据
  678. int CServerSocket::ProcessResReadSpecSingleVarData(CSocketHandle &sockHandle, void *pBuffer)
  679. {
  680. ReadSingleSpecialVarData *pReadSpecSnVar = (ReadSingleSpecialVarData *)pBuffer;
  681. ReqSingleSpecialVarData tmpReqSpecSnVar;
  682. memset(&tmpReqSpecSnVar, 0, sizeof(ReqSingleSpecialVarData));
  683. tmpReqSpecSnVar.Header.nCmd = pReadSpecSnVar->Header.nCmd;
  684. tmpReqSpecSnVar.Header.nCmdType = pReadSpecSnVar->Header.nCmdType;
  685. memcpy(tmpReqSpecSnVar.DevUid, pReadSpecSnVar->DevUid, sizeof(pReadSpecSnVar->DevUid));
  686. tmpReqSpecSnVar.iSpecialFlag = pReadSpecSnVar->iSpecialFlag;
  687. tmpReqSpecSnVar.VarData.iVarid = pReadSpecSnVar->iVarid;
  688. memset(&g_ReadOneData, 0, sizeof(READDEVREALDATA));
  689. if (RequestSpecData((char*)pReadSpecSnVar->DevUid, pReadSpecSnVar->iVarid, pReadSpecSnVar->iSpecialFlag) == 0)
  690. {
  691. int nRet = SingleResponseSpecialVarData((char*)pReadSpecSnVar->DevUid, pReadSpecSnVar->iVarid, pReadSpecSnVar->iSpecialFlag);
  692. if( nRet != 0 )
  693. {
  694. return nRet;
  695. }
  696. }
  697. else
  698. {
  699. return ERR_CODE_MODBUS_ASC_COM_READ_NO_DATA;
  700. }
  701. tmpReqSpecSnVar.VarData.nStatus = g_ReadOneData.iStatus;
  702. tmpReqSpecSnVar.VarData.Data = g_ReadOneData.dbData;
  703. tmpReqSpecSnVar.Header.Verify = 0;
  704. tmpReqSpecSnVar.Header.nLen = sizeof(ReqSingleSpecialVarData);
  705. int nSendLen = tmpReqSpecSnVar.Header.nLen;
  706. tmpReqSpecSnVar.Header.Verify = CalcCheckSum( &tmpReqSpecSnVar, nSendLen );
  707. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)&tmpReqSpecSnVar, nSendLen);
  708. return 0;
  709. }
  710. //请求读特殊变量的数据
  711. int CServerSocket::ProcessResReadSpecMulVarData(CSocketHandle &sockHandle, void *pBuffer)
  712. {
  713. char* pResBuffer =NULL;
  714. MulSpecialVarData tmpMulVarData = {0};
  715. vector<ChildVarData> vChild_varData;
  716. ChildVarData tmpchildData = {0};
  717. char* pDataBuff = (char*)pBuffer;
  718. memcpy(&tmpMulVarData, pDataBuff, sizeof(MulSpecialVarData));
  719. //取所有变量的ID
  720. for(int i =0; i< tmpMulVarData.nVarSum; i++)
  721. {
  722. int iPos = sizeof(MulSpecialVarData) +i*sizeof(tmpchildData.iVarid);
  723. memcpy(&tmpchildData.iVarid, pDataBuff + iPos, sizeof(tmpchildData.iVarid));
  724. memset(&g_ReadOneData, 0, sizeof(READDEVREALDATA));
  725. SETBASEPARAM SetBasePara;
  726. char chDataLen[4] = {0};
  727. char chPort[4] = {0};
  728. char chAddr[4] = {0};
  729. char chSpecialdevice[2] = {0};
  730. GetOneVarProerty((char*)tmpMulVarData.DevUid, tmpchildData.iVarid, &SetBasePara,
  731. chDataLen, chPort, chAddr, chSpecialdevice);
  732. if (atoi(chSpecialdevice) == 0)
  733. {
  734. if (RtuRequestData(SetBasePara, chDataLen, chPort, chAddr)==0)
  735. RtuSingleResponseData((char*)tmpMulVarData.DevUid, tmpchildData.iVarid);
  736. else
  737. return -1;
  738. }
  739. else if (atoi(chSpecialdevice) == 1)
  740. {
  741. if (RequestData(SetBasePara, chDataLen, chPort, chAddr)==0)
  742. SingleResponseData((char*)tmpMulVarData.DevUid, tmpchildData.iVarid);
  743. else
  744. return -1;
  745. }
  746. tmpchildData.Data = g_ReadOneData.dbData;//2.2;
  747. tmpchildData.nStatus = g_ReadOneData.iStatus;
  748. vChild_varData.push_back(tmpchildData);
  749. }
  750. //求发送的应答数据包长度
  751. int nSendLen = tmpMulVarData.Header.nLen +
  752. tmpMulVarData.nVarSum *(sizeof(tmpchildData.nStatus) +
  753. sizeof(tmpchildData.Data));
  754. tmpMulVarData.Header.Verify = 0;
  755. tmpMulVarData.Header.nLen = nSendLen;
  756. pResBuffer = new char[nSendLen];
  757. //求校验位
  758. memcpy(pResBuffer, (char *)&tmpMulVarData, sizeof(MulSpecialVarData));
  759. for(int i = 0; i< tmpMulVarData.nVarSum; i++)
  760. memcpy(pResBuffer + sizeof(MulVarData) + i*sizeof(ChildVarData), &vChild_varData[i], sizeof(ChildVarData));
  761. tmpMulVarData.Header.Verify = CalcCheckSum( &pResBuffer, nSendLen );
  762. //发送应答数据包
  763. memset(pResBuffer, 0, nSendLen);
  764. memcpy(pResBuffer, (char *)&tmpMulVarData, sizeof(MulSpecialVarData));
  765. for(int i = 0; i< tmpMulVarData.nVarSum; i++)
  766. memcpy(pResBuffer + sizeof(MulSpecialVarData) + i*sizeof(ChildVarData), &vChild_varData[i], sizeof(ChildVarData));
  767. g_pTcpServer->SocketSend(sockHandle, (unsigned char *)pResBuffer, nSendLen);
  768. delete []pResBuffer;
  769. return 0;
  770. }