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

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. extern HWND g_hMainWnd;
  3. extern HWND g_hStatusBar;
  4. CWHList<CGateInfo*> g_xGateInfoList;
  5. // **************************************************************************************
  6. //
  7. //
  8. //
  9. // **************************************************************************************
  10. void UpdateStatusBarGateSession(BOOL fGrow)
  11. {
  12. static long nNumOfCurrGateSession = 0;
  13. TCHAR szText[20];
  14. (fGrow ? InterlockedIncrement(&nNumOfCurrGateSession) : InterlockedDecrement(&nNumOfCurrGateSession));
  15. wsprintf(szText, _TEXT("%d Sessions"), nNumOfCurrGateSession);
  16. SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(4, 0), (LPARAM)szText);
  17. }
  18. BOOL InitGateCommSocket(SOCKET &s, SOCKADDR_IN* addr, UINT nMsgID, int nPort, long lEvent)
  19. {
  20. if (s == INVALID_SOCKET)
  21. {
  22. s = socket(AF_INET, SOCK_STREAM, 0);
  23. addr->sin_family = AF_INET;
  24. addr->sin_port = htons(nPort);
  25. addr->sin_addr.s_addr = htonl(INADDR_ANY);
  26. if ((bind(s, (const struct sockaddr FAR*)addr, sizeof(SOCKADDR_IN))) == SOCKET_ERROR)
  27. return FALSE;
  28. if ((listen(s, 5)) == SOCKET_ERROR)
  29. return FALSE;
  30. if ((WSAAsyncSelect(s, g_hMainWnd, nMsgID, lEvent)) == SOCKET_ERROR)
  31. return FALSE;
  32. }
  33. else 
  34. return FALSE;
  35. return TRUE;
  36. }
  37. LPARAM OnGateCommSockMsg(WPARAM wParam, LPARAM lParam)
  38. {
  39. switch (WSAGETSELECTEVENT(lParam))
  40. {
  41. case FD_ACCEPT:
  42. {
  43. CGateInfo* pGateInfo = new CGateInfo;
  44. if (pGateInfo)
  45. {
  46. pGateInfo->sock = accept(wParam, (struct sockaddr FAR *)NULL, NULL);
  47. WSAAsyncSelect(pGateInfo->sock, g_hMainWnd, _IDM_GATECOMMSOCK_MSG, FD_READ|FD_CLOSE);
  48. if (g_xGateInfoList.AddNewNode(pGateInfo))
  49. {
  50. int zero = 0;
  51. setsockopt(pGateInfo->sock, SOL_SOCKET, SO_SNDBUF, (char *)&zero, sizeof(zero) );
  52. UpdateStatusBarGateSession(TRUE);
  53. }
  54. }
  55. break;
  56. }
  57. case FD_CLOSE:
  58. {
  59. UpdateStatusBarGateSession(FALSE);
  60. break;
  61. }
  62. case FD_READ:
  63. {
  64. int  nSocket = 0;
  65. char szTmp[DATA_BUFSIZE];
  66. UINT nRecv = 0;
  67. CGateInfo* pGateInfo;
  68. PLISTNODE pListNode = g_xGateInfoList.GetHead();
  69. while (pListNode)
  70. {
  71. pGateInfo = (CGateInfo*)g_xGateInfoList.GetData(pListNode);
  72. if (pGateInfo->sock == (SOCKET)wParam)
  73. break;
  74. pListNode = g_xGateInfoList.GetNext(pListNode);
  75. }
  76. nRecv = pGateInfo->Recv();
  77. if ( nRecv <= 0 )
  78. break;
  79. pGateInfo->bufLen += nRecv;
  80. while ( pGateInfo->HasCompletionPacket() )
  81. {
  82. memset( szTmp, 0, sizeof( szTmp ) );
  83. *(pGateInfo->ExtractPacket( szTmp ) - 1) = '';
  84. switch ( szTmp[1] )
  85. {
  86. case '-':
  87. pGateInfo->SendKeepAlivePacket();
  88. break;
  89. case 'A':
  90. pGateInfo->ReceiveSendUser(&szTmp[2]);
  91. break;
  92. case 'O':
  93. pGateInfo->ReceiveOpenUser(&szTmp[2]);
  94. break;
  95. case 'X':
  96. pGateInfo->ReceiveCloseUser(&szTmp[2]);
  97. break;
  98. }
  99. }
  100. break;
  101. }
  102. }
  103. return 0L;
  104. }