debug_server_socket.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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. }
  63. }
  64. DWORD WINAPI WorkerThread(LPVOID lpParam)
  65. {
  66. int i;
  67. fd_set fdread;
  68. int ret;
  69. struct timeval tv = {1, 0};
  70. while (TRUE)
  71. {
  72. char szMessage[MSGSIZE] = {0};
  73. FD_ZERO(&fdread);
  74. for (i = 0; i < g_iTotalConn; i++)
  75. {
  76. FD_SET(g_CliSocketArr[i], &fdread);
  77. }
  78. // We only care read event
  79. ret = select(0, &fdread, NULL, NULL, &tv);
  80. if (ret == 0)
  81. {
  82. // Time expired
  83. continue;
  84. }
  85. for (i = 0; i < g_iTotalConn; i++)
  86. {
  87. if (FD_ISSET(g_CliSocketArr[i], &fdread))
  88. {
  89. // A read event happened on g_CliSocketArr
  90. ret = recv(g_CliSocketArr[i], szMessage, MSGSIZE, 0);
  91. if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET))
  92. {
  93. // Client socket closed
  94. printf("Client socket %d closed./n", g_CliSocketArr[i]);
  95. closesocket(g_CliSocketArr[i]);
  96. if (i < g_iTotalConn-1)
  97. {
  98. g_CliSocketArr[i--] = g_CliSocketArr[--g_iTotalConn];
  99. }
  100. }
  101. else
  102. {
  103. // We reveived a message from client
  104. if(strlen(szMessage) > 0)
  105. {
  106. printf("receive a messagexxxx: %s\n", szMessage);
  107. }
  108. //char buf[100] = "hello word.\n";
  109. //send(g_CliSocketArr[i], buf, strlen(buf), 0);
  110. parserMsg(g_CliSocketArr[i], szMessage);
  111. }
  112. }
  113. }
  114. }
  115. }
  116. int parserMsg(SOCKET s, char *msg)
  117. {
  118. if(NULL == msg)
  119. {
  120. return ERROR;
  121. }
  122. int i=0;
  123. int word_num = 0;
  124. char *p;
  125. char *delims=" ";
  126. char *next_token = NULL;
  127. char localBuf[MAX_CMD_WORD_NUM][MAX_CMD_WORD_LEN] = {0};
  128. p=strtok_s(msg, delims, &next_token);
  129. while(p!=NULL)
  130. {
  131. strcpy_s(localBuf[word_num++], p);
  132. p=strtok_s(NULL, delims, &next_token);
  133. }
  134. for(i=0; i<word_num; i++)
  135. {
  136. printf("parser result localBuf[%d]:%s\n", i, localBuf[i]);
  137. }
  138. if(0 == strcmp("clear", strlwr(localBuf[0])))
  139. {
  140. for(i=0; i<LOCATION_SYSTEM_BRANCH_MAX; i++)
  141. {
  142. LocationSystemCount[i] = 0;
  143. }
  144. }
  145. if((0 == strcmp("show", strlwr(localBuf[0]))) && (0 == strcmp("count", strlwr(localBuf[1]))))
  146. {
  147. printf("Show data collect.\n");
  148. //send(s, resp, strlen(resp), 0);
  149. for(i=0; i<LOCATION_SYSTEM_BRANCH_MAX; i++)
  150. {
  151. if(LocationSystemCount[i] > 0)
  152. {
  153. char resp[100] = {0};
  154. sprintf(resp, "LocationSystemCount[%d]:%d ", i, LocationSystemCount[i]);
  155. send(s, resp, strlen(resp), 0);
  156. }
  157. }
  158. }
  159. if((0 == strcmp("show", strlwr(localBuf[0]))) && (0 == strcmp("time", strlwr(localBuf[1]))))
  160. {
  161. //printf("Show 1 min data collect.\n");
  162. int time = atoi(strlwr(localBuf[2]));
  163. char resp_tmp[100] = {0};
  164. sprintf(resp_tmp, "Wait %d min data collect.\n", time);
  165. send(s, resp_tmp, strlen(resp_tmp), 0);
  166. for(i=0; i<LOCATION_SYSTEM_BRANCH_MAX; i++)
  167. {
  168. LocationSystemCount[i] = 0;
  169. }
  170. Sleep(time*60*1000);
  171. for(i=0; i<LOCATION_SYSTEM_BRANCH_MAX; i++)
  172. {
  173. if(LocationSystemCount[i] > 0)
  174. {
  175. char resp[100] = {0};
  176. sprintf(resp, "LocationSystemCount[%d]:%d", i, LocationSystemCount[i]);
  177. send(s, resp, strlen(resp), 0);
  178. }
  179. }
  180. }
  181. return OK;
  182. }