zclient.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:5k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include <stdafx.h>
  2. //#include "IClient.h"
  3. #include "....LINUXIClient.h"
  4. #include "KSG_EncodeDecode.h"
  5. #include <winsock2.h>
  6. #define MAX_TEMP_SIZE 65000
  7. int init_client_socket = 0;
  8. int IClientThread::action() {
  9. //select进行发送和接收
  10. fd_set read_set, write_set;
  11. struct timeval time_out;
  12. time_out.tv_sec = 0;
  13. time_out.tv_usec = 2;
  14. //char temp_buffer[MAX_TEMP_SIZE]; //64k的临时缓冲区
  15. int length = 0;
  16. while(true) {
  17. if(parent->bStop) 
  18. break;
  19.     FD_ZERO(&read_set);
  20. FD_SET(parent->nSocket, &read_set);
  21. if (select(parent->nSocket + 1, &read_set, NULL, NULL, &time_out) != 0) { //有数据等待读
  22. int bufsize = 0;
  23. char* recv_buffer = parent->buffer->getReceiveBuffer(bufsize);
  24. if (!recv_buffer)
  25. break;
  26. length = recv(parent->nSocket, recv_buffer, bufsize, 0);
  27. if(length < 0) { //出错了,连接中断
  28. //int error = WSAGetLastError();
  29. break;
  30. }
  31. else {
  32. // if (length > 0)
  33. // length = length;
  34. parent->buffer->receiveData(length);
  35. }
  36. }
  37. if(parent->bStop) break;
  38. char *send_ptr = parent->buffer->getSendData(length);
  39. if(send_ptr) {
  40. FD_ZERO(&write_set);
  41. FD_SET(parent->nSocket, &write_set);
  42. //printf("send data %dn", length);
  43. if(select(parent->nSocket + 1, NULL, &write_set, NULL, &time_out) != 0) { //有数据等待写
  44. int length1 = send(parent->nSocket, send_ptr, length, 0);
  45. if(length1 < 0) {
  46. break;
  47. }
  48. else {
  49. if (length1 != length)
  50. length1 = length1;
  51. parent->buffer->sendData(length1);
  52. }
  53. }
  54. }
  55. #ifndef __linux
  56. Sleep(1);
  57. #else
  58. usleep(1);
  59. #endif
  60. }
  61. if(parent->call_back) parent->call_back(parent->call_back_param, enumServerConnectClose);
  62. parent->buffer->clear();
  63. parent->m_uServerKey = parent->m_uClientKey = 0;
  64. return 0;
  65. }
  66. IClient::IClient(int max_send, int max_receive) {
  67. if(!init_client_socket) {
  68. #ifndef __linux
  69. WSADATA wsa_data;
  70. WSAStartup(MAKEWORD(1, 1), &wsa_data);
  71. #endif
  72. init_client_socket++;
  73. }
  74. buffer = new ZBuffer(max_send, max_receive);
  75. call_back = NULL;
  76. m_uServerKey = m_uClientKey = 0;
  77. bStop = false;
  78. thread = new IClientThread(this);
  79. bConnected = false;
  80. }
  81. IClient::~IClient() {
  82. delete thread;
  83. if(--init_client_socket) {
  84. #ifndef __linux
  85. WSACleanup();
  86. #endif
  87. }
  88. }
  89. int IClient::Startup() {
  90. return 1;
  91. }
  92. int IClient::Cleanup() {
  93. return 1;
  94. }
  95. int IClient::Shutdown() {
  96. bStop = true;
  97. if (bConnected) {
  98. shutdown(nSocket, 2);
  99. closesocket(nSocket);
  100. bConnected = false;
  101. }
  102. return 0;
  103. }
  104. bool IClient::ConnectTo(const char * const &pAddressToConnectServer, unsigned short usPortToConnectServer) {
  105. int nReturn;
  106. if (bConnected)
  107. return false;
  108. nSocket = socket(AF_INET, SOCK_STREAM, 0);
  109. if (nSocket == -1)
  110. return false;
  111.     struct sockaddr_in addrServer;
  112. memset((void*)&addrServer, 0, sizeof(addrServer));
  113. addrServer.sin_family = AF_INET;
  114. addrServer.sin_port = htons(usPortToConnectServer);
  115. addrServer.sin_addr.s_addr = inet_addr(pAddressToConnectServer);
  116. //memset(&addrServer.sin_zero, 0, 8);
  117. nReturn = connect(nSocket,(struct sockaddr *)&addrServer, sizeof(addrServer));
  118. if(nReturn < 0) 
  119. return false;
  120. /* read_index = buffer->getConnection();
  121. if (read_index == -1)
  122. {
  123. return false;
  124. }
  125. write_index = buffer->getConnection();
  126. if (write_index == -1) 
  127. return false;*/
  128. if (call_back) 
  129. call_back(call_back_param, enumServerConnectCreate);
  130. bStop = false;
  131. thread->start();
  132. bConnected = true;
  133. return true;
  134. }
  135. void IClient::RegisterMsgFilter(void * lpParam, CALLBACK_CLIENT_EVENT pfnEventNotify) {
  136. call_back = pfnEventNotify;
  137. call_back_param = lpParam;
  138. }
  139. bool IClient::SendPackToServer( const void * const pData, const unsigned long datalength) {
  140. int count = 0;
  141. while(!m_uClientKey) { //如果还没有密钥,则收第一个包(包含密钥)
  142. #ifndef __linux
  143. Sleep(1);
  144. #else
  145. usleep(1);
  146. #endif
  147. unsigned int length;
  148. GetPackFromServer(length);
  149. if(++count == 1000)
  150. return false;
  151. }
  152. buffer->packData((const char *)pData, datalength);
  153. int length;
  154. char *data = buffer->completePacket(length);
  155. if(!data) return false;
  156. unsigned& uKey = m_uClientKey;
  157. KSG_EncodeBuf(length, (unsigned char *)data, &uKey);
  158. buffer->sendPacket();
  159. return true;
  160. }
  161. void *IClient::GetPackFromServer(unsigned int &datalength ) {
  162. if(m_uServerKey == 0) { //第一个数据包
  163. ACCOUNT_BEGIN *pAccountBegin = (ACCOUNT_BEGIN * )buffer->getPacket((int &)datalength);
  164. if(pAccountBegin) {
  165. printf("first packet %d %dn", pAccountBegin->ServerKey, pAccountBegin->ClientKey);
  166. if(pAccountBegin->ProtocolType == CIPHER_PROTOCOL_TYPE) {
  167. m_uServerKey = ~(pAccountBegin->ServerKey);
  168. m_uClientKey = ~(pAccountBegin->ClientKey);
  169. }
  170. }
  171. return NULL;
  172. }
  173. else {
  174. char *data = (char*)buffer->getPacket((int &)datalength);
  175. if(data) {
  176. /* printf("-----BEFORE uServerKey = %undatalen = %u, data = ", m_uServerKey, datalength);
  177. for (int i = 0; i < 32; i++)
  178. printf("[%02X] ", ((BYTE *)data)[i]);
  179. printf("n");*/
  180. unsigned& uKey = m_uServerKey;
  181. KSG_DecodeBuf(datalength, (unsigned char *)data, &uKey);
  182. /* printf("-----AFTER uServerKey = %undatalen = %u, data = ", m_uServerKey, datalength);
  183. for (int i = 0; i < 32; i++)
  184. printf("[%02X] ", ((BYTE *)data)[i]);
  185. printf("n");*/
  186. }
  187. return data;
  188. }
  189. }