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

模拟服务器

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. DWORD WINAPI ThreadFuncForMsg(LPVOID lpParameter);
  3. BOOL CheckSocketError(LPARAM lParam);
  4. VOID WINAPI OnTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
  5. void OnCommand(WPARAM wParam, LPARAM lParam);
  6. BOOL InitThread(LPTHREAD_START_ROUTINE lpRoutine);
  7. extern SOCKET g_csock;
  8. extern HWND g_hMainWnd;
  9. extern HWND g_hStatusBar;
  10. extern HWND g_hToolBar;
  11. HANDLE g_hMsgThread = INVALID_HANDLE_VALUE;
  12. CWHQueue g_xMsgQueue;
  13. static char WorkBuff[8192];
  14. static int nWorkBuffLen;
  15. LPARAM OnClientSockMsg(WPARAM wParam, LPARAM lParam)
  16. {
  17. switch (WSAGETSELECTEVENT(lParam))
  18. {
  19. case FD_CONNECT:
  20. {
  21. DWORD dwThreadIDForMsg = 0;
  22. if (CheckSocketError(lParam))
  23. {
  24. dwThreadIDForMsg = 0;
  25. if (InitThread(ThreadFuncForMsg))
  26. // if ((g_hMsgThread = CreateThread(NULL, 0, ThreadFuncForMsg, NULL, 0, &dwThreadIDForMsg)) != INVALID_HANDLE_VALUE)
  27. {
  28. KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);
  29. SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE, 5000, (TIMERPROC)OnTimerProc);
  30. InsertLogMsg(IDS_CONNECT_LOGINSERVER);
  31. SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT("Connected"));
  32. }
  33. }
  34. else
  35. {
  36. closesocket(g_csock);
  37. g_csock = INVALID_SOCKET;
  38. SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc);
  39. }
  40. break;
  41. }
  42. case FD_CLOSE:
  43. {
  44. closesocket(g_csock);
  45. g_csock = INVALID_SOCKET;
  46. OnCommand(IDM_STOPSERVICE, 0);
  47. break;
  48. }
  49. case FD_READ:
  50. {
  51. int nSocket = 0;
  52. char *pszFirst = NULL, *pszEnd = NULL;
  53. UINT nRecv = 0;
  54. ioctlsocket((SOCKET)wParam, FIONREAD, (u_long *)&nRecv);
  55. if (nRecv)
  56. {
  57. char *pszPacket = new char[nRecv + 1];
  58. nRecv = recv((SOCKET)wParam, pszPacket, nRecv, 0);
  59. pszPacket[nRecv] = '';
  60. if (!(g_xMsgQueue.PushQ((BYTE *)pszPacket)))
  61. InsertLogMsg(_TEXT("[INFO] Not enough queue(g_xMsgQueue) buffer."));
  62. }
  63. break;
  64. }
  65. }
  66. return 0L;
  67. }
  68. void SendExToServer(char *pszPacket)
  69. {
  70. /* int nTotalSendBytes = 0;
  71. while (TRUE)
  72. {
  73. if ((nLen - nTotalSendBytes <= 0) || g_csock == INVALID_SOCKET)
  74. return;
  75. nTotalSendBytes += send(g_csock, pszData, nLen - nTotalSendBytes, 0);
  76. if (nTotalSendBytes < nLen)
  77. pszData += (nLen - nTotalSendBytes);
  78. else 
  79. return;
  80. } */
  81. DWORD dwSendBytes;
  82. WSABUF buf;
  83. buf.len = memlen(pszPacket) - 1;
  84. buf.buf = pszPacket;
  85. WSASend(g_csock, &buf, 1, &dwSendBytes, 0, NULL, NULL);
  86. }