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

模拟服务器

开发平台:

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. {
  27. KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER);
  28. SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE, 5000, (TIMERPROC)OnTimerProc);
  29. InsertLogMsg(IDS_CONNECT_LOGINSERVER);
  30. SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT("Connected"));
  31. }
  32. }
  33. else
  34. {
  35. closesocket(g_csock);
  36. g_csock = INVALID_SOCKET;
  37. SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc);
  38. }
  39. break;
  40. }
  41. case FD_CLOSE:
  42. {
  43. closesocket(g_csock);
  44. g_csock = INVALID_SOCKET;
  45. OnCommand(IDM_STOPSERVICE, 0);
  46. break;
  47. }
  48. case FD_READ:
  49. {
  50. int nSocket = 0;
  51. char *pszFirst = NULL, *pszEnd = NULL;
  52. UINT nRecv = 0;
  53. ioctlsocket((SOCKET)wParam, FIONREAD, (u_long *)&nRecv);
  54. if (nRecv)
  55. {
  56. char *pszPacket = new char[nRecv + 1];
  57. nRecv = recv((SOCKET)wParam, pszPacket, nRecv, 0);
  58. pszPacket[nRecv] = '';
  59. if (!(g_xMsgQueue.PushQ((BYTE *)pszPacket)))
  60. InsertLogMsg(_TEXT("[INFO] Not enough queue(g_xMsgQueue) buffer."));
  61. }
  62. break;
  63. }
  64. }
  65. return 0L;
  66. }
  67. void SendExToServer(char *pszPacket)
  68. {
  69. DWORD dwSendBytes;
  70. WSABUF buf;
  71. buf.len = memlen(pszPacket) - 1;
  72. buf.buf = pszPacket;
  73. if ( WSASend(g_csock, &buf, 1, &dwSendBytes, 0, NULL, NULL) == SOCKET_ERROR )
  74. {
  75. int nErr = WSAGetLastError();
  76. }
  77. }