ServerSockMsg.cpp
Upload User: szopptop
Upload Date: 2013-04-23
Package Size: 1047k
Code Size: 4k
Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. void SendExToServer(char *pszPacket);
  3. extern SOCKET g_ssock;
  4. extern SOCKET g_csock;
  5. extern HWND g_hStatusBar;
  6. extern HANDLE g_hIOCP;
  7. CWHList<CSessionInfo*> g_xSessionList;
  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. //UINT WINAPI AcceptThread(LPVOID lpParameter)
  17. DWORD WINAPI AcceptThread(LPVOID lpParameter)
  18. {
  19. int nLen = sizeof(SOCKADDR_IN);
  20. char szMsg[64];
  21. SOCKET Accept;
  22. SOCKADDR_IN Address;
  23. while (TRUE)
  24. {
  25. Accept = accept(g_ssock, (struct sockaddr FAR *)&Address, &nLen);
  26. if (g_fTerminated)
  27. return 0;
  28. CSessionInfo* pNewUserInfo = (CSessionInfo*)GlobalAlloc(GPTR, sizeof(CSessionInfo));
  29. if (pNewUserInfo)
  30. {
  31. pNewUserInfo->sock = Accept;
  32. CreateIoCompletionPort((HANDLE)pNewUserInfo->sock, g_hIOCP, (DWORD)pNewUserInfo, 0);
  33. if (g_xSessionList.AddNewNode(pNewUserInfo))
  34. {
  35. int zero = 0;
  36. setsockopt(pNewUserInfo->sock, SOL_SOCKET, SO_SNDBUF, (char *)&zero, sizeof(zero) );
  37. // ORZ:
  38. pNewUserInfo->Recv();
  39. UpdateStatusBar(TRUE);
  40. szMsg[0] = '%';
  41. szMsg[1] = 'O';
  42. char *pszPos = ValToAnsiStr((int)Accept, &szMsg[2]);
  43. *pszPos++ = '/';
  44. pszPos = ValToAnsiStr((int)Address.sin_addr.s_net, pszPos);
  45. *pszPos++ = '.';
  46. pszPos = ValToAnsiStr((int)Address.sin_addr.s_host, pszPos);
  47. *pszPos++ = '.';
  48. pszPos = ValToAnsiStr((int)Address.sin_addr.s_lh, pszPos);
  49. *pszPos++ = '.';
  50. pszPos = ValToAnsiStr((int)Address.sin_addr.s_impno, pszPos);
  51. *pszPos++ = '$';
  52. *pszPos = '';
  53. SendExToServer(szMsg);
  54. }
  55. }
  56. }
  57. return 0;
  58. }
  59. //void CloseSession(CSessionInfo* pSessionInfo)
  60. void CloseSession(int s)
  61. {
  62. char szMsg[32];
  63. // Send close msg to login server
  64. //wsprintf(szMsg, _TEXT("%%X%d$"), s);
  65. szMsg[0] = '%';
  66. szMsg[1] = 'X';
  67. char *pszPos = ValToAnsiStr(s, &szMsg[2]);
  68. *pszPos++ = '$';
  69. *pszPos = '';
  70. SendExToServer(szMsg); 
  71. closesocket(s);
  72. UpdateStatusBar(FALSE);
  73. }
  74. DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
  75. {
  76. DWORD dwBytesTransferred = 0;
  77. CSessionInfo* pSessionInfo = NULL;
  78. _LPTCOMPLETIONPORT lpPerIoData = NULL;
  79. char szPacket[DATA_BUFSIZE * 2];
  80. char szMsg[32];
  81. char *pszPos;
  82. while (TRUE)
  83. {
  84. if ( GetQueuedCompletionStatus( 
  85. (HANDLE)CompletionPortID, 
  86. &dwBytesTransferred, 
  87. (LPDWORD)&pSessionInfo, 
  88. (LPOVERLAPPED *)&lpPerIoData, 
  89. INFINITE) == 0)
  90. {
  91. if (g_fTerminated)
  92. return 0;
  93. if (pSessionInfo)
  94. {
  95. szMsg[0] = '%';
  96. szMsg[1] = 'X';
  97. char *pszPos = ValToAnsiStr((int)pSessionInfo->sock, &szMsg[2]);
  98. *pszPos++ = '$';
  99. *pszPos = '';
  100. SendExToServer(szMsg); 
  101. g_xSessionList.RemoveNodeByData(pSessionInfo);
  102. closesocket(pSessionInfo->sock);
  103. pSessionInfo->sock = INVALID_SOCKET;
  104. UpdateStatusBar(FALSE);
  105. GlobalFree(pSessionInfo);
  106. }
  107. continue;
  108. }
  109. if (g_fTerminated)
  110. return 0;
  111. if (dwBytesTransferred == 0)
  112. {
  113. szMsg[0] = '%';
  114. szMsg[1] = 'X';
  115. char *pszPos = ValToAnsiStr((int)pSessionInfo->sock, &szMsg[2]);
  116. *pszPos++ = '$';
  117. *pszPos = '';
  118. SendExToServer(szMsg); 
  119. g_xSessionList.RemoveNodeByData(pSessionInfo);
  120. closesocket(pSessionInfo->sock);
  121. pSessionInfo->sock = INVALID_SOCKET;
  122. UpdateStatusBar(FALSE);
  123. GlobalFree(pSessionInfo);
  124. continue;
  125. }
  126. // ORZ:
  127. pSessionInfo->bufLen += dwBytesTransferred;
  128. while ( pSessionInfo->HasCompletionPacket() )
  129. {
  130. szPacket[0] = '%';
  131. szPacket[1] = 'A';
  132. pszPos = ValToAnsiStr( (int) pSessionInfo->sock, &szPacket[2] );
  133. *pszPos++ = '/';
  134. pszPos = pSessionInfo->ExtractPacket( pszPos );
  135. *pszPos++ = '$';
  136. *pszPos = '';
  137. SendExToServer( szPacket );
  138. }
  139. // ORZ:
  140. if ( pSessionInfo->Recv() == SOCKET_ERROR && WSAGetLastError() != ERROR_IO_PENDING )
  141. {
  142. InsertLogMsg(_TEXT("WSARecv() failed"));
  143. CloseSession(pSessionInfo->sock);
  144. continue;
  145. }
  146. }
  147. return 0;
  148. }