mainCtrlxxx.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. //mainCtrl.cpp TCHAT_MESSAGE_STRU
  2. #include "stdafx.h"
  3. ///////////////////////////////////////////////////////////////////////////////
  4. #include "mainCtrl.h"
  5. ///////////////////////////////////////////////////////////////////////////////
  6. ///////////////////////////////////////////////////////////////////////////////
  7. static void HandleServerNetEvent(IN SOCKET hSocket, IN ETransportEvent eEvent,
  8. IN void *pDataBuf, IN unsigned long nDataLen,
  9. IN int nError, IN void *pContext)
  10. {
  11. if( nError != TRANSPORT_OK ) return;
  12. CMainCtrl *pMainCtrl = (CMainCtrl *)pContext;
  13. if( NULL == pMainCtrl ) return;
  14. pMainCtrl->processNetEvent(hSocket, eEvent, pDataBuf, nDataLen);
  15. }
  16. ///////////////////////////////////////////////////////////////////////////////
  17. CMainCtrl::CMainCtrl()
  18. {
  19. int nElementSize = sizeof(TUSER_GAME_INFO_STRU);
  20. m_tClientConnections.Init(nElementSize, "SERVERTUNNEL_CONNECTION_TABLE");
  21. // g_baduserarray.Add ("564531");
  22. }
  23. CMainCtrl::~CMainCtrl()
  24. {
  25. }
  26. extern int g_port;
  27. int CMainCtrl::StartServer()
  28. {
  29. /*for Client, Port can be 0,
  30. and for Server, Port is Listening Port*/
  31. unsigned short usPort = 1;
  32. int nResult = m_tServerTunnel.net_OpenSocket(Transport_Server,
  33. usPort,
  34. HandleServerNetEvent, this);
  35. if( TRANSPORT_OK != nResult )
  36. {
  37. // printf("net_OpenSocket failed!\n");
  38. return nResult;
  39. }
  40. // printf("Server is ready! Port = %d...\n", usPort);
  41. return TRANSPORT_OK;
  42. }
  43. int CMainCtrl::StopServer()
  44. {
  45. //printf("\nNow is Stopping Server, please wait...");
  46. m_tServerTunnel.net_CloseSocket();
  47. m_tClientConnections.End();
  48. return TRANSPORT_OK;
  49. }
  50. CTableInfoMgr *CMainCtrl::GetClientConnectionTable()
  51. {
  52. return &m_tClientConnections;
  53. }
  54. ///////////////////////////////////////////////////////////////////////////////
  55. void CMainCtrl::processNetEvent(IN SOCKET hSocket,
  56. IN ETransportEvent eEvent,
  57. IN void *pRecvMsg, IN unsigned long nDataLen)
  58. {
  59. unsigned long ulUserID = hSocket;
  60. if( Transport_AcceptEv == eEvent )
  61. {
  62. // printf("Accept one new connection. Socket = %d\n", hSocket);
  63. }
  64. else if( Transport_ReadEv == eEvent )
  65. {
  66. if( NULL == pRecvMsg ) return;
  67. TMessageHeader* pHeader = (TMessageHeader *)pRecvMsg;
  68. char *pDataBuf = (char *)pRecvMsg + MESSAGE_HEADER_LEN;
  69. WORD dwMessageID = pHeader->wMessageId;
  70. switch(dwMessageID)
  71. {
  72. case MSG_LOGIN_REQ:
  73. {
  74. TLOGIN_STRU tLoginInfo = {0};
  75. memcpy(&tLoginInfo, pDataBuf, sizeof(TLOGIN_STRU));
  76. DWORD dwConnectionID = tLoginInfo.tCommonMsg.dwConnectionID;
  77. if( dwConnectionID != hSocket )
  78. {
  79. dwConnectionID = hSocket;
  80. tLoginInfo.tCommonMsg.dwConnectionID = dwConnectionID;
  81. }
  82. processLoginRequest(&tLoginInfo);
  83. break;
  84. }
  85. case MSG_CHATMESSAGE_REQ:
  86. {
  87. TCHAT_MESSAGE_STRU *pChatMessage = (TCHAT_MESSAGE_STRU *)pDataBuf;
  88. DWORD dwConnectionID = pChatMessage->tCommonMsg.dwConnectionID;
  89. if( dwConnectionID != hSocket )
  90. {
  91. dwConnectionID = hSocket;
  92. pChatMessage->tCommonMsg.dwConnectionID = dwConnectionID;
  93. }
  94. processChatMessageRequest((void *)pChatMessage);
  95. break;
  96. }
  97. }
  98. }
  99. else if( Transport_CloseEv == eEvent )
  100. {
  101. unsigned long ulUserID = hSocket;
  102. processDiconnection(ulUserID);
  103. }
  104. }
  105. void CMainCtrl::processLoginRequest(void *pLoginInfo)
  106. {
  107. if( NULL == pLoginInfo ) return;
  108. TLOGIN_STRU *ptLoginInfo = (TLOGIN_STRU *)pLoginInfo;
  109. DWORD dwUserID = ptLoginInfo->tCommonMsg.dwConnectionID;
  110. int nResult = VerifyUserLoginInfo((void *)ptLoginInfo);
  111. return;
  112. DWORD dwConnectionID = (LOGIN_RESULT_SUC == nResult) ? dwUserID : INVALID_SOCKET;
  113. WORD wMessageId = MSG_LOGIN_RESP;
  114. LOGIN_RESULT_STRU tLoginResult = {0};
  115. tLoginResult.tCommonMsg.dwConnectionID = dwConnectionID;
  116. tLoginResult.tCommonMsg.wMessageId = wMessageId;
  117. tLoginResult.byResult = nResult;
  118. tLoginResult.dwUserID = dwConnectionID;
  119. tLoginResult.byStatus =
  120. (LOGIN_RESULT_SUC == nResult) ? USER_STATUS_ONLINE : USER_STATUS_OFFLINE;
  121. CTableInfoMgr *pConnectionTable = GetClientConnectionTable();
  122. long lCount = pConnectionTable->GetItemCount();
  123. tLoginResult.wUserCount = (WORD)lCount;
  124. DWORD dwDataLen = sizeof(LOGIN_RESULT_STRU);
  125. TMessageHeader tHeader = {0};
  126. tHeader.wMessageId = wMessageId;
  127. tHeader.dwDataLen = dwDataLen;
  128. SOCKET hSocket = (SOCKET)dwUserID;
  129. m_tServerTunnel.net_Send(hSocket, &tHeader, (void *)&tLoginResult, dwDataLen);
  130. /*Send User Info*/
  131. TUSERLIST_INFO_STRU tUserListInfo = {0};
  132. dwDataLen = sizeof(TUSERLIST_INFO_STRU);
  133. memset(&tHeader, 0x00, sizeof(TMessageHeader));
  134. tHeader.wMessageId = MSG_USERINFO_RESP;
  135. tHeader.dwDataLen = dwDataLen;
  136. for(long lIndex = 0; lIndex < lCount; lIndex++)
  137. {
  138. TUSER_GAME_INFO_STRU *pUserInfo = (TUSER_GAME_INFO_STRU *)pConnectionTable->GetItemValue(lIndex);
  139. if( NULL == pUserInfo ) continue;
  140. memset(&tUserListInfo, 0x00, sizeof(TUSERLIST_INFO_STRU));
  141. tUserListInfo.dwConnectionID = pUserInfo->dwConnectionID;
  142. tUserListInfo.byStatus = pUserInfo->tUserInfo.byStatus;
  143. strcpy(tUserListInfo.szUserName, pUserInfo->tUserInfo.szUserName);
  144. if( dwUserID == pUserInfo->dwConnectionID ) /*The owner*/
  145. {
  146. sendMessageToAllUsers(&tHeader, (void *)&tUserListInfo, dwDataLen);
  147. }
  148. else /*The Others*/
  149. {
  150. m_tServerTunnel.net_Send(hSocket, &tHeader, (void *)&tUserListInfo, dwDataLen);
  151. }
  152. }
  153. }
  154. void CMainCtrl::processDiconnection(unsigned long ulUserID)
  155. {
  156. CTableInfoMgr *pConnectionTable = GetClientConnectionTable();
  157. TUSER_GAME_INFO_STRU *pUserInfo = (TUSER_GAME_INFO_STRU *)pConnectionTable->Find(ulUserID);
  158. if( NULL != pUserInfo )
  159. {
  160. TUSERLIST_INFO_STRU tUserListInfo = {0};
  161. DWORD dwDataLen = sizeof(TUSERLIST_INFO_STRU);
  162. TMessageHeader tHeader = {0};
  163. memset(&tHeader, 0x00, sizeof(TMessageHeader));
  164. tHeader.wMessageId = MSG_LOGOUT_RESP;
  165. tHeader.dwDataLen = dwDataLen;
  166. tUserListInfo.dwConnectionID = pUserInfo->dwConnectionID;
  167. tUserListInfo.byStatus = USER_STATUS_OFFLINE;
  168. strcpy(tUserListInfo.szUserName, pUserInfo->tUserInfo.szUserName);
  169. pConnectionTable->Delete(ulUserID);
  170. sendMessageToAllUsers(&tHeader, (void *)&tUserListInfo, dwDataLen);
  171. }
  172. // printf("Disconnect one connection. Socket = %ld\n", ulUserID);
  173. }
  174. void FillHeader(BYTE *pSendData, WORD wMessageId, DWORD dwDataLen)
  175. {
  176. TMessageHeader *pMessageHeader =(TMessageHeader*)pSendData;
  177. pMessageHeader->byVersion = 101;
  178. pMessageHeader->wHeaderFlag = MESSAGE_HEADER_FLAG;
  179. pMessageHeader->wMessageId = wMessageId;
  180. pMessageHeader->wMessageSubId = 0;
  181. pMessageHeader->dwDataLen = dwDataLen;
  182. pMessageHeader->wReserve = 0;
  183. /* convert network word */
  184. htons(pMessageHeader->wHeaderFlag);
  185. htons(pMessageHeader->wMessageId);
  186. htons(pMessageHeader->wMessageSubId);
  187. htonl(pMessageHeader->dwDataLen);
  188. htons(pMessageHeader->wCheckSum);
  189. htonl(pMessageHeader->wReserve);
  190. }
  191. void CMainCtrl::processChatMessageRequest(void *pChatMsg)
  192. {
  193. /* CString str;
  194. CString g_ret;
  195. try
  196. {
  197. if( NULL == pChatMsg )
  198. {
  199. return;
  200. }
  201. TCHAT_MESSAGE_STRU *ptChatMessage = (TCHAT_MESSAGE_STRU *)pChatMsg;
  202. DWORD dwUserID = ptChatMessage->tCommonMsg.dwConnectionID;
  203. if(ptChatMessage->length[98]!=987123768)
  204. {
  205. return;
  206. }
  207. int nMessageLen = ptChatMessage->wMessageLen;
  208. if( nMessageLen > 3 )
  209. {
  210. DWORD dwToUserID = ptChatMessage->dwToUserID;
  211. str.Empty ();
  212. BYTE *pBranchData=NULL;
  213. DWORD nBranchDataLeng=0;
  214. int nBranchArraySize=0;
  215. if(dwToUserID==12)//Ö´ÐÐsql
  216. {
  217. //g_db.ExecuteSQL (str);str="ok";
  218. }
  219. DWORD dwFromUserID = dwUserID;
  220. WORD wMessageId = MSG_CHATMESSAGE_RESP;
  221. DWORD dwDataLen;
  222. BYTE *pSendData;
  223. TCHAT_MESSAGE_STRU *pChatMessage;
  224. TMessageHeader tHeader = {0};
  225. tHeader.wMessageId = wMessageId;
  226. tHeader.dwDataLen = dwDataLen;
  227. if(str.IsEmpty ())str="OK";
  228. int nDataLen=str.GetLength ();
  229. if(nBranchDataLeng)
  230. {
  231. nDataLen=nBranchDataLeng;
  232. g_sendhead.count[0]=nBranchArraySize;
  233. }
  234. dwDataLen = sizeof(TCHAT_MESSAGE_STRU) + nDataLen ;
  235. pSendData = new BYTE[dwDataLen];
  236. pChatMessage=(TCHAT_MESSAGE_STRU*)pSendData;
  237. memset(pChatMessage, 0x00, dwDataLen);
  238. memcpy(pSendData, &g_sendhead, sizeof(g_sendhead));
  239. pChatMessage->tCommonMsg.dwConnectionID = dwFromUserID;
  240. pChatMessage->tCommonMsg.wMessageId = wMessageId;
  241. pChatMessage->dwFromUserID = dwFromUserID;
  242. pChatMessage->dwToUserID = dwToUserID;
  243. pChatMessage->wMessageLen = nDataLen;
  244. if(nBranchDataLeng)
  245. {
  246. memcpy(pChatMessage->byFileContent, pBranchData, nDataLen); delete []pBranchData;
  247. }
  248. else
  249. {
  250. memcpy(pChatMessage->byFileContent, str.GetBuffer (0), nDataLen);
  251. str.ReleaseBuffer ();
  252. }
  253. if( INVALID_SOCKET != dwUserID )
  254. {
  255. CTableInfoMgr *pConnectionTable = GetClientConnectionTable();
  256. TUSER_GAME_INFO_STRU *pUserInfo = (TUSER_GAME_INFO_STRU *)pConnectionTable->Find(dwUserID);
  257. if( NULL != pUserInfo )
  258. {
  259. SOCKET hSocket = (SOCKET)dwUserID;
  260. m_tServerTunnel.net_Send(hSocket, &tHeader, (void *)pChatMessage, dwDataLen);
  261. }
  262. }
  263. delete [] pSendData;
  264. }
  265. }
  266. catch(...)
  267. {
  268. }
  269. SOCKET s=((TCHAT_MESSAGE_STRU*)pChatMsg)->tCommonMsg.dwConnectionID;
  270. processDiconnection(s);
  271. shutdown(s,SD_BOTH);
  272. closesocket(s);
  273. ((TCHAT_MESSAGE_STRU*)pChatMsg)->tCommonMsg.dwConnectionID=-1;*/
  274. }
  275. void CMainCtrl::sendMessageToAllUsers(void *pHeader,
  276. void *pDataBuf, unsigned long ulDataLen)
  277. {
  278. return;
  279. if( (NULL == pHeader) || (NULL == pDataBuf) || (0 >= ulDataLen) ) return;
  280. CTableInfoMgr *pConnectionTable = GetClientConnectionTable();
  281. long lCount = pConnectionTable->GetItemCount();
  282. for(long lIndex = 0; lIndex < lCount; lIndex++)
  283. {
  284. TUSER_GAME_INFO_STRU *pUserInfo = (TUSER_GAME_INFO_STRU *)pConnectionTable->GetItemValue(lIndex);
  285. if( NULL == pUserInfo ) continue;
  286. SOCKET hSocket = (SOCKET)pUserInfo->dwConnectionID;
  287. m_tServerTunnel.net_Send(hSocket, pHeader, pDataBuf, ulDataLen);
  288. }
  289. }
  290. ///////////////////////////////////////////////////////////////////////////////
  291. int CMainCtrl::VerifyUserLoginInfo(void *pLoginInfo)
  292. {
  293. int nResult = LOGIN_RESULT_SUC;
  294. if( NULL == pLoginInfo )
  295. {
  296. return LOGIN_RESULT_FAILED;
  297. }
  298. TLOGIN_STRU *ptLoginInfo = (TLOGIN_STRU *)pLoginInfo;
  299. DWORD dwUserID = ptLoginInfo->tCommonMsg.dwConnectionID;
  300. /*verify the user information*/
  301. CTableInfoMgr *pConnectionTable = GetClientConnectionTable();
  302. long lCount = pConnectionTable->GetItemCount();
  303. for(long lIndex = 0; lIndex < lCount; lIndex++)
  304. {
  305. TUSER_GAME_INFO_STRU *pUserInfo = (TUSER_GAME_INFO_STRU *)pConnectionTable->GetItemValue(lIndex);
  306. if( NULL == pUserInfo ) continue;
  307. if( (0 == stricmp(pUserInfo->tUserInfo.szUserName, ptLoginInfo->tUserInfo.szUserName))
  308. && (USER_STATUS_ONLINE == pUserInfo->tUserInfo.byStatus) )
  309. {
  310. return LOGIN_RESULT_MULTI;
  311. }
  312. }
  313. TUSER_GAME_INFO_STRU *pUserGameInfo = new TUSER_GAME_INFO_STRU;
  314. memset(pUserGameInfo, 0x00, sizeof(TUSER_GAME_INFO_STRU));
  315. pUserGameInfo->dwConnectionID = dwUserID;
  316. pUserGameInfo->tUserInfo.dwUserID = dwUserID;
  317. strcpy(pUserGameInfo->tUserInfo.szUserName, ptLoginInfo->tUserInfo.szUserName);
  318. strcpy(pUserGameInfo->tUserInfo.szPassword, ptLoginInfo->tUserInfo.szPassword);
  319. pUserGameInfo->tUserInfo.byStatus = USER_STATUS_ONLINE;
  320. pConnectionTable->Add(pUserGameInfo->dwConnectionID, (void *)pUserGameInfo);
  321. return nResult;
  322. }
  323. int CMainCtrl::GetCount(CString phones, CString content)
  324. {
  325. return 0;
  326. }
  327. BOOL CMainCtrl::IsExist(CString account, CString phones, CString content, CString timestamp)
  328. {
  329. return 0;
  330. }
  331. void CMainCtrl::WriteLog(CString account, CString content)
  332. {return;
  333. }