ClientSocket.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // ClientSocket.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "YAServer.h"
  5. #include "ClientSocket.h"
  6. #include "YAServerDlg.h"
  7. #include "Functions/Functions.h"
  8. #include "socketdef.h"
  9. #include "socketdef.h"
  10. // CClientSocket
  11. CClientSocket::CClientSocket(CYAServerDlg* pDlg)
  12. {
  13. m_pDlg = pDlg;
  14. m_bClosed = FALSE;
  15. bError = false;
  16. m_wReadLength = 0;
  17. m_wDataLength = 0;
  18. m_wCharacterWord = 0;
  19. reader_id = 0;
  20. m_ReceiveBuffer = (BYTE*)malloc(LENGTH_MSG_4K);
  21. }
  22. CClientSocket::~CClientSocket()
  23. {
  24. free(m_ReceiveBuffer);
  25. //delete UserCallInfo;
  26. }
  27. void CClientSocket::Init()
  28. {
  29. }
  30. void CClientSocket::Abort()
  31. {
  32. }
  33. BOOL CClientSocket::SendData( WORD wCharacterWord, int wLength, BYTE* DataBuffer )
  34. {
  35. BYTE SendBuffer[LENGTH_MSG_4K];
  36. WORD nlength = wLength + sizeof(WORD) + sizeof(WORD); //socket的数据长度 数据的长度(n) + 特征字(2) + 校验码(2)
  37. memset(SendBuffer, 0, LENGTH_MSG_4K);
  38. int nPos = 0;
  39. CFunctions::memcpyWord(SendBuffer, nlength, nPos);//长度
  40. nPos += sizeof(WORD);
  41. CFunctions::memcpyWord(SendBuffer, wCharacterWord, nPos);
  42. nPos += sizeof(WORD);
  43. memcpy(&SendBuffer[nPos], &DataBuffer[0], wLength);
  44. nPos += wLength;
  45. WORD wCrc = CFunctions::getCRC(&SendBuffer[sizeof(WORD)], wLength + sizeof(WORD)); // 数据长度 + 特征字
  46. CFunctions::memcpyWord(SendBuffer, wCrc, nPos);
  47. nPos += sizeof(WORD);
  48. int sRet = Send(SendBuffer, nPos);
  49. Sleep(20);
  50. if(sRet == SOCKET_ERROR)
  51. {
  52. return FALSE;
  53. }
  54. return TRUE;
  55. }
  56. void CClientSocket::OnSend(int nErrorCode)
  57. {
  58. switch(nErrorCode)
  59. {
  60. case 0:
  61. break;
  62. case WSAENETDOWN:
  63. bError = true;
  64. //m_pDlg->showerr();
  65. break;
  66. default:
  67. break;
  68. }
  69. CAsyncSocket::OnSend(nErrorCode);
  70. }
  71. void CClientSocket::OnReceive(int nErrorCode)
  72. {
  73. if( nErrorCode != 0 )
  74. {
  75. bError = true;
  76. return;
  77. }
  78. bError = false;
  79. m_bClosed = FALSE;
  80. m_pDlg->receive_data(this);
  81. CAsyncSocket::OnReceive(nErrorCode);
  82. }
  83. void CClientSocket::OnConnect(int nErrorCode)
  84. {
  85. if(0 != nErrorCode){
  86. m_pDlg->remove_socket(this);
  87. }
  88. }
  89. void CClientSocket::OnClose(int nErrorCode)
  90. {
  91. bError = true;
  92. CAsyncSocket::OnClose(nErrorCode);
  93. //CString sMsg;
  94. //switch(nErrorCode)
  95. //{
  96. // case WSAENETDOWN://套接字操作遇到一个不活动的网络
  97. // sMsg="网络不可用:";
  98. // break;
  99. // case WSAECONNRESET://远程主机强制关闭
  100. // sMsg="客户端强制关闭:";
  101. // break;
  102. // case WSAECONNABORTED://一个已建立的连接被你的主机上的软件终止,可能是因为一次数据传输超时或是协议错误。
  103. // sMsg="关闭客户端:";
  104. // break;
  105. // case 0://正常退出
  106. // sMsg="正常退出:";
  107. // break;
  108. // default:
  109. // sMsg="退出:";
  110. // break;
  111. //}
  112. if(m_bClosed){
  113. return;
  114. }
  115. m_pDlg->remove_socket(this);
  116. m_bClosed = TRUE;
  117. ShutDown();
  118. //delete this;
  119. }
  120. IMPLEMENT_DYNAMIC(CClientSocket, CAsyncSocket)