ServerSockMsg.cpp
上传用户:szopptop
上传日期:2013-04-23
资源大小:1047k
文件大小:5k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. extern HWND g_hStatusBar;
  3. extern SOCKET g_ssock;
  4. extern SOCKET g_csock;
  5. extern HANDLE g_hIOCP;
  6. CWHDynamicArray<CSessionInfo> g_UserInfoArray;
  7. CWHQueue g_SendToServerQ;
  8. void UpdateStatusBar(BOOL fGrow)
  9. {
  10. static long nNumOfCurrSession = 0;
  11. TCHAR szText[20];
  12. (fGrow ? InterlockedIncrement(&nNumOfCurrSession) : InterlockedDecrement(&nNumOfCurrSession));
  13. wsprintf(szText, _TEXT("%d Sessions"), nNumOfCurrSession);
  14. SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(3, 0), (LPARAM)szText);
  15. }
  16. void SendSocketMsgS (_LPTMSGHEADER lpMsg, int nLen1, char *pszData1, int nLen2, char *pszData2)
  17. {
  18. char szBuf[1024];
  19. WSABUF Buf;
  20. DWORD dwSendBytes;
  21. memmove(szBuf, lpMsg, sizeof(_TMSGHEADER));
  22. if (pszData1)
  23. memmove(&szBuf[sizeof(_TMSGHEADER)], pszData1, nLen1);
  24. if (pszData2)
  25. memmove(&szBuf[sizeof(_TMSGHEADER) + nLen1], pszData2, nLen2);
  26. szBuf[sizeof(_TMSGHEADER) + nLen1 + nLen2] = '';
  27. Buf.len = sizeof(_TMSGHEADER) + nLen1 + nLen2;
  28. Buf.buf = szBuf;
  29. WSASend(g_csock, &Buf, 1, &dwSendBytes, 0, NULL, NULL);
  30. // send(g_csock, szBuf, sizeof(_TMSGHEADER) + nLen1 + nLen2, 0);
  31. //#ifdef _DEBUG
  32. // _RPT4(_CRT_WARN, "SS:%d %d %d %dt", lpMsg->wUserGateIndex, lpMsg->wIdent, lpMsg->wUserListIndex, lpMsg->nLength);
  33. // _RPT1(_CRT_WARN, "%sn", szBuf);
  34. //#endif
  35. }
  36. void SendSocketMsgS (int nIdent, WORD wIndex, int nSocket, WORD wSrvIndex, int nLen, char *pszData)
  37. {
  38. _TMSGHEADER msg;
  39. char szBuf[1024];
  40. WSABUF Buf;
  41. DWORD dwSendBytes;
  42. msg.nCode = 0xAA55AA55;
  43. msg.nSocket = nSocket;
  44. msg.wUserGateIndex = wIndex;
  45. msg.wIdent = (WORD)nIdent;
  46. msg.wUserListIndex = wSrvIndex;
  47. msg.nLength = nLen;
  48. memmove(szBuf, &msg, sizeof(_TMSGHEADER));
  49. if (pszData)
  50. memmove(&szBuf[sizeof(_TMSGHEADER)], pszData, nLen);
  51. szBuf[sizeof(_TMSGHEADER) + nLen] = '';
  52. Buf.len = sizeof(_TMSGHEADER) + nLen;
  53. Buf.buf = szBuf;
  54. WSASend(g_csock, &Buf, 1, &dwSendBytes, 0, NULL, NULL);
  55. // send(g_csock, szBuf, sizeof(_TMSGHEADER) + nLen, 0);
  56. //#ifdef _DEBUG
  57. // _RPT4(_CRT_WARN, "SS:%d %d %d %d t", msg.wUserGateIndex, msg.wIdent, msg.wUserListIndex, msg.nLength);
  58. // _RPT1(_CRT_WARN, "%sn", szBuf);
  59. //#endif
  60. }
  61. //UINT WINAPI AcceptThread(LPVOID lpParameter)
  62. DWORD WINAPI AcceptThread(LPVOID lpParameter)
  63. {
  64. int nLen = sizeof(SOCKADDR_IN);
  65. char szMsg[64];
  66. TCHAR szAddress[24];
  67. int nCvtLen;
  68. SOCKET Accept;
  69. SOCKADDR_IN Address;
  70. // DWORD dwRecvBytes;
  71. // DWORD dwFlags;
  72. while (TRUE)
  73. {
  74. Accept = accept(g_ssock, (struct sockaddr FAR *)&Address, &nLen);
  75. if (g_fTerminated)
  76. return 0;
  77. int nIndex = g_UserInfoArray.GetAvailablePosition();
  78. if (nIndex >= 0)
  79. {
  80. CSessionInfo* pNewSessionInfo = g_UserInfoArray.GetEmptyElement(nIndex);
  81. pNewSessionInfo->sock = Accept;
  82. pNewSessionInfo->nGateIndex = nIndex;
  83. // Initializing Session Information
  84. pNewSessionInfo->nCrackWarningLevel = 0;
  85. pNewSessionInfo->fLoginCode = TRUE;
  86. pNewSessionInfo->nSendBufferLen = 0;
  87. CreateIoCompletionPort((HANDLE)Accept, g_hIOCP, (DWORD)pNewSessionInfo, 0);
  88. pNewSessionInfo->Recv();
  89. UpdateStatusBar(TRUE);
  90. // Make packet and send to login server.
  91. wsprintf(szAddress, _TEXT("%d.%d.%d.%d"), Address.sin_addr.s_net, Address.sin_addr.s_host, 
  92. Address.sin_addr.s_lh, Address.sin_addr.s_impno);
  93. nCvtLen = WideCharToMultiByte(CP_ACP, 0, szAddress, -1, szMsg, sizeof(szMsg), NULL, NULL);
  94. SendSocketMsgS(GM_OPEN, pNewSessionInfo->nGateIndex, (int)pNewSessionInfo->sock, 0, nCvtLen + 1, szMsg);
  95. }
  96. }
  97. return 0;
  98. }
  99. void CloseSession(CSessionInfo* pSessionInfo)
  100. {
  101. g_UserInfoArray.SetEmptyElement(pSessionInfo->nGateIndex, pSessionInfo);
  102. closesocket(pSessionInfo->sock);
  103. UpdateStatusBar(FALSE);
  104. }
  105. DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
  106. {
  107. DWORD dwBytesTransferred;
  108. // DWORD dwFlags;
  109. // DWORD dwRecvBytes;
  110. // DWORD dwSendBytes;
  111. CSessionInfo* pSessionInfo;
  112. LPOVERLAPPED lpOverlapped;
  113. // char *pszFirst, *pszEnd;
  114. // CHAR szBuff[DATA_BUFSIZE + 1];
  115. // INT nBuffLen;
  116. while (TRUE)
  117. {
  118. GetQueuedCompletionStatus((HANDLE)CompletionPortID, &dwBytesTransferred, (LPDWORD)&pSessionInfo, 
  119. (LPOVERLAPPED *)&lpOverlapped, INFINITE);
  120. if (dwBytesTransferred == 0)
  121. {
  122. SendSocketMsgS(GM_CLOSE, pSessionInfo->nGateIndex, pSessionInfo->sock, pSessionInfo->nServerUserIndex, 0, NULL);
  123. CloseSession(pSessionInfo);
  124. continue;
  125. }
  126. if (pSessionInfo->nOvFlag == OVERLAPPED_RECV)
  127. {
  128. pSessionInfo->bufLen += dwBytesTransferred;
  129. while ( pSessionInfo->HasCompletionPacket() )
  130. {
  131. _LPTSENDBUFF pSendData = new _TSENDBUFF;
  132. if ( !pSendData )
  133. break;
  134. pSendData->sock = pSessionInfo->sock;
  135. pSendData->nGateIndex = pSessionInfo->nGateIndex;
  136. *(pSessionInfo->ExtractPacket( pSendData->szData )) = '';
  137. g_SendToServerQ.Lock();
  138. if ( !g_SendToServerQ.PushQ( (BYTE *) pSendData ) )
  139. {
  140. InsertLogMsg( _TEXT("PushQ() failed") );
  141. delete pSendData;
  142. }
  143. g_SendToServerQ.Unlock();
  144. }
  145. if ( pSessionInfo->Recv() == SOCKET_ERROR && WSAGetLastError() != ERROR_IO_PENDING )
  146. {
  147. InsertLogMsg(_TEXT("WSARecv() failed"));
  148. CloseSession(pSessionInfo);
  149. continue;
  150. }
  151. }
  152. }
  153. return 0L;
  154. }