Advertisement
Guest User

Untitled

a guest
May 29th, 2015
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. #define WIN32_LEAN_AND_MEAN
  2. #include <Windows.h>
  3. #include <WinSock2.h>
  4. #include <WS2tcpip.h>
  5. #include <stdlib.h>
  6. #include <iostream>
  7. #include <string>
  8. #include <thread>
  9. #include <map>
  10. #include <vector>
  11.  
  12. #define SERVER_PORT "20516"
  13. #define DEFAULT_BUFLEN 512
  14. #pragma comment(lib, "Ws2_32.lib")
  15.  
  16. std::thread _socket_accept_thread;
  17. std::vector<std::thread> _client_threads;
  18. std::vector<SOCKET> _clients;
  19. std::map <SOCKET, std::string > _client_idents;
  20.  
  21. SOCKET listen_socket = INVALID_SOCKET, client_socket = INVALID_SOCKET;
  22. struct addrinfo *results = NULL, hints;
  23.  
  24. bool _stopping = FALSE;
  25.  
  26. void socket_accept_loop();
  27. void process_socket_loop(SOCKET&);
  28. void process_line(std::string);
  29. std::vector<std::string> split_args(std::string);
  30. std::string recv_line(SOCKET&);
  31. void cleanup();
  32.  
  33. enum chat_commands{
  34. chat_users,
  35. chat_send,
  36. chat_online,
  37. chat_none,
  38. };
  39.  
  40. std::map<chat_commands, std::string> chat_command_map = {
  41. { chat_users, "USR" },
  42. { chat_send, "SEND" },
  43. { chat_online, "ONL" },
  44. };
  45.  
  46.  
  47. int main(int argc, char ** argv){
  48. WSAData wsa_data;
  49. int result;
  50.  
  51.  
  52.  
  53. result = WSAStartup(MAKEWORD(2, 2), &wsa_data);
  54. if (result){
  55. std::cout << "WSAStartup error: " << result << std::endl;
  56. return 1;
  57. }
  58.  
  59. ZeroMemory(&hints, sizeof(hints));
  60. hints.ai_protocol = IPPROTO_TCP;
  61. hints.ai_family = AF_INET;
  62. hints.ai_socktype = SOCK_STREAM;
  63. hints.ai_flags = AI_PASSIVE;
  64.  
  65. result = getaddrinfo(NULL, SERVER_PORT, &hints, &results);
  66. if (result){
  67. std::cout << "getaddrinfo failed: " << result << std::endl;
  68. WSACleanup();
  69. return 1;
  70. }
  71. listen_socket = socket(results->ai_family, results->ai_socktype, results->ai_protocol);
  72. if (listen_socket == INVALID_SOCKET){
  73. std::cout << "Failed to create listen_socket: " << WSAGetLastError() << std::endl;
  74. return 1;
  75. }
  76. result = bind(listen_socket, results->ai_addr, (int)results->ai_addrlen);
  77. if (result == SOCKET_ERROR){
  78. std::cout << "Failed to bind to SERVER_PORT. " << WSAGetLastError() << std::endl;
  79. freeaddrinfo(results);
  80. closesocket(listen_socket);
  81. WSACleanup();
  82. return 1;
  83. }
  84. freeaddrinfo(results);
  85.  
  86. result = listen(listen_socket, SOMAXCONN);
  87. if (result == SOCKET_ERROR){
  88. std::cout << "Failed to begin listening on SERVER_PORT " << WSAGetLastError() << std::endl;
  89. closesocket(listen_socket);
  90. WSACleanup();
  91. return 1;
  92. }
  93.  
  94. _socket_accept_thread = std::thread(socket_accept_loop);
  95.  
  96. std::string in;
  97. do
  98. {
  99. std::getline(std::cin, in);
  100. }
  101. while (in.find("stop") == std::string::npos);
  102. cleanup();
  103. }
  104.  
  105. void cleanup(){
  106. _stopping = true;
  107. closesocket(listen_socket);
  108. if (_clients.size() > 0){
  109. for (std::vector<SOCKET>::iterator it = _clients.begin(); it != _clients.end(); ++it){
  110. if ((*it) != INVALID_SOCKET);
  111. closesocket(*it);
  112. }
  113. }
  114. WSACleanup();
  115. _socket_accept_thread.join();
  116. for (std::vector<std::thread>::iterator it = _client_threads.begin(); it != _client_threads.end(); ++it){
  117. if ((*it).joinable())
  118. (*it).join();
  119.  
  120. }
  121. }
  122.  
  123. void socket_accept_loop(){
  124. do{
  125. struct sockaddr_in client_info = { 0 };
  126. int size = sizeof(client_info);
  127. char clientaddr[INET6_ADDRSTRLEN];
  128. client_socket = accept(listen_socket, (sockaddr*)&client_info, &size);
  129. if (client_socket != INVALID_SOCKET){
  130. inet_ntop(client_info.sin_family, &client_info.sin_addr, clientaddr, INET6_ADDRSTRLEN);
  131. std::cout << "Accepted: " << clientaddr << std::endl;
  132. _clients.push_back(client_socket);
  133. _client_threads.push_back(std::thread(process_socket_loop, client_socket));
  134. }
  135.  
  136. } while (!_stopping);
  137. }
  138.  
  139. std::string recv_line(SOCKET & s){
  140. std::string recv_str;
  141. int recvlen;
  142. do{
  143. char recv_buffer[DEFAULT_BUFLEN];
  144. recvlen = recv(s, recv_buffer, DEFAULT_BUFLEN, 0);
  145. if (recvlen > 0)
  146. recv_str.append(recv_buffer, 0, recvlen);
  147.  
  148. } while (recv_str.find('\n') == std::string::npos && recvlen > 0);
  149. return recv_str;
  150. }
  151. void process_socket_loop(SOCKET & s){
  152. std::string recv_str;
  153. do{
  154. recv_str = recv_line(s);
  155. process_line(recv_str);
  156. } while (!_stopping);
  157.  
  158. }
  159. std::vector<std::string> split_args(std::string _s){
  160. std::vector<std::string> split_strings;
  161. std::string s(_s);
  162. int pos;
  163. while ((pos = s.find(' ')) != std::string::npos){
  164. split_strings.push_back(s.substr(0, pos));
  165. s.erase(0, pos + 1);
  166. }
  167. split_strings.push_back(s); //pushes what's left of the string to the vector
  168. return split_strings;
  169. }
  170. void process_line(std::string _s){
  171. chat_commands cur_command = chat_none;
  172. std::vector<std::string> args;
  173. for (std::map<chat_commands, std::string>::iterator it = chat_command_map.begin(); it != chat_command_map.end(); ++it){
  174. if (_s.find((*it).second) != std::string::npos){
  175. cur_command = (*it).first;
  176. }
  177. }
  178. if (cur_command == chat_none){
  179. return;
  180. }
  181. else{
  182. _s.erase(0, chat_command_map[cur_command].size() + 1);
  183. args = split_args(_s);
  184. std::cout << "COMMAND: " << chat_command_map[cur_command].c_str() << std::endl << "ARGS: " << _s.c_str() << std::endl;
  185. }
  186. switch (cur_command){
  187.  
  188. }
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement