debug_server_socket.cpp 4.5 KB

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