debug_server_socket.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include <iostream>
  2. #include <winsock.h>
  3. #include <stdio.h>
  4. #include "./../system_basic_info/SystemAnalysis.h"
  5. #include "debug_server_socket.h"
  6. using namespace std;
  7. #define PORT 6123
  8. #define MSGSIZE 1024
  9. #pragma warning(disable: 4018)
  10. #pragma warning(disable: 4996)
  11. #pragma comment(lib, "ws2_32.lib")
  12. #define CLIENT_SOCKET_NUM_MAX 20
  13. int g_iTotalConn = 0;
  14. SOCKET g_CliSocketArr[CLIENT_SOCKET_NUM_MAX + 1];
  15. DWORD WINAPI WorkerThread(LPVOID lpParam);
  16. DWORD WINAPI AcceptThread(LPVOID lpParam);
  17. int parserMsg(SOCKET s, char *msg);
  18. SOCKET sListen;
  19. int debug_server_init(void)
  20. {
  21. HANDLE hThread;
  22. WSADATA wsaData;
  23. //SOCKET sClient;
  24. SOCKADDR_IN local;
  25. //SOCKADDR_IN client;
  26. int iAddrSize = sizeof(SOCKADDR_IN);
  27. DWORD dwThreadId;
  28. DWORD dwAcceptThreadId;
  29. // Initialize windows socket library
  30. WSAStartup(0x0202, &wsaData);
  31. // Create listening socket
  32. sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  33. // Bind
  34. local.sin_family = AF_INET;
  35. local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  36. local.sin_port = htons(PORT);
  37. bind(sListen, (sockaddr*)&local, sizeof(SOCKADDR_IN));
  38. // Listen
  39. listen(sListen, 3);
  40. // Create worker thread
  41. CreateThread(NULL, 0, WorkerThread, NULL, 0, &dwThreadId);
  42. hThread = CreateThread(NULL, 0, AcceptThread, NULL, 0, &dwAcceptThreadId);
  43. //WaitForSingleObject(hThread, INFINITE);
  44. return 0;
  45. }
  46. DWORD WINAPI AcceptThread(LPVOID lpParam)
  47. {
  48. SOCKET sClient;
  49. SOCKADDR_IN client;
  50. int iAddrSize = sizeof(SOCKADDR_IN);
  51. while (TRUE)
  52. {
  53. // Accept a connection
  54. sClient = accept(sListen, (sockaddr*)&client, &iAddrSize);
  55. printf("Accepted client:%s:%d/n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
  56. // Add socket to g_CliSocketArr
  57. if(g_iTotalConn > CLIENT_SOCKET_NUM_MAX - 1)
  58. {
  59. continue;
  60. }
  61. g_CliSocketArr[g_iTotalConn++] = sClient;
  62. Sleep(1);
  63. }
  64. }
  65. DWORD WINAPI WorkerThread(LPVOID lpParam)
  66. {
  67. int i;
  68. fd_set fdread;
  69. int ret;
  70. struct timeval tv = {1, 0};
  71. while (TRUE)
  72. {
  73. char szMessage[MSGSIZE] = {0};
  74. FD_ZERO(&fdread);
  75. for (i = 0; i < g_iTotalConn; i++)
  76. {
  77. FD_SET(g_CliSocketArr[i], &fdread);
  78. }
  79. // We only care read event
  80. ret = select(0, &fdread, NULL, NULL, &tv);
  81. if (ret == 0)
  82. {
  83. // Time expired
  84. continue;
  85. }
  86. for (i = 0; i < g_iTotalConn; i++)
  87. {
  88. if (FD_ISSET(g_CliSocketArr[i], &fdread))
  89. {
  90. // A read event happened on g_CliSocketArr
  91. ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);
  92. if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))
  93. {
  94. // Client socket closed
  95. printf("Client socket %d closed./n", g_CliSocketArr[i]);
  96. closesocket(g_CliSocketArr[i]);
  97. if (i < g_iTotalConn-1)
  98. {
  99. g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn];
  100. }
  101. }
  102. else
  103. {
  104. // We reveived a message from client
  105. if(strlen(szMessage) > 0)
  106. {
  107. printf("receive a messagexxxx: %s\n", szMessage);
  108. }
  109. //char buf[100] = "hello word.\n";
  110. //send(g_CliSocketArr[i], buf, strlen(buf), 0);
  111. parserMsg(g_CliSocketArr[i], szMessage);
  112. }
  113. }
  114. }
  115. Sleep(1);
  116. }
  117. }
  118. int parserMsg(SOCKET s, char *msg)
  119. {
  120. if(NULL == msg)
  121. {
  122. return ERROR;
  123. }
  124. int i=0;
  125. int word_num = 0;
  126. char *p;
  127. char *delims=" ";
  128. char *next_token = NULL;
  129. char localBuf[MAX_CMD_WORD_NUM][MAX_CMD_WORD_LEN] = {0};
  130. p=strtok_s(msg, delims, &next_token);
  131. while(p!=NULL)
  132. {
  133. strcpy_s(localBuf[word_num++], p);
  134. p=strtok_s(NULL, delims, &next_token);
  135. }
  136. for(i=0; i<word_num; i++)
  137. {
  138. printf("parser result localBuf[%d]:%s\n", i, localBuf[i]);
  139. }
  140. if(0 == strcmp("clear", strlwr(localBuf[0])))
  141. {
  142. for(i=0; i<LOCATION_SYSTEM_BRANCH_MAX; i++)
  143. {
  144. LocationSystemCount[i] = 0;
  145. }
  146. }
  147. if((0 == strcmp("show", strlwr(localBuf[0]))) && (0 == strcmp("count", strlwr(localBuf[1]))))
  148. {
  149. printf("Show data collect.\n");
  150. //send(s, resp, strlen(resp), 0);
  151. for(i=0; i<LOCATION_SYSTEM_BRANCH_MAX; i++)
  152. {
  153. if(LocationSystemCount[i] > 0)
  154. {
  155. char resp[100] = {0};
  156. sprintf(resp, "LocationSystemCount[%d]:%d ", i, LocationSystemCount[i]);
  157. send(s, resp, strlen(resp), 0);
  158. }
  159. }
  160. }
  161. if((0 == strcmp("show", strlwr(localBuf[0]))) && (0 == strcmp("time", strlwr(localBuf[1]))))
  162. {
  163. //printf("Show 1 min data collect.\n");
  164. int time = atoi(strlwr(localBuf[2]));
  165. char resp_tmp[100] = {0};
  166. sprintf(resp_tmp, "Wait %d min data collect.\n", time);
  167. send(s, resp_tmp, strlen(resp_tmp), 0);
  168. for(i=0; i<LOCATION_SYSTEM_BRANCH_MAX; i++)
  169. {
  170. LocationSystemCount[i] = 0;
  171. }
  172. Sleep(time*60*1000);
  173. for(i=0; i<LOCATION_SYSTEM_BRANCH_MAX; i++)
  174. {
  175. if(LocationSystemCount[i] > 0)
  176. {
  177. char resp[100] = {0};
  178. sprintf(resp, "LocationSystemCount[%d]:%d", i, LocationSystemCount[i]);
  179. send(s, resp, strlen(resp), 0);
  180. }
  181. }
  182. }
  183. return OK;
  184. }