Endil

cn-lab5-client

Nov 25th, 2015
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.26 KB | None | 0 0
  1. // cn-lab5-client.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #define _WINSOCK_DEPRECATED_NO_WARNINGS
  6. #include <chrono>
  7. #include <condition_variable>
  8. #include <iostream>
  9. #include <limits>
  10. #include <map>
  11. #include <random>
  12. #include <regex>
  13. #include <string>
  14. #include <thread>
  15. #include <winsock2.h>
  16.  
  17. #pragma comment(lib, "ws2_32.lib")
  18. #undef max
  19.  
  20. using namespace std;
  21. using namespace std::chrono;
  22.  
  23. typedef unsigned long long ull;
  24. typedef time_point<system_clock, milliseconds> timepoint;
  25.  
  26. mutex m;
  27. condition_variable cvar;
  28. bool cvar_backup;
  29. random_device rd;
  30. mt19937 mt(rd());
  31. uniform_int_distribution<ull> dist(1, numeric_limits<ull>::max());
  32.  
  33. class Network {
  34. private:
  35.     SOCKET sock;
  36.     sockaddr_in server_addr;
  37. public:
  38.     Network() {
  39.         WSAData wsadata;
  40.         WSAStartup(0x0202, &wsadata);
  41.         SOCKET sock;
  42.         sock = socket(AF_INET, SOCK_STREAM, 0);
  43.         this->sock = sock;
  44.         sockaddr_in server_addr;
  45.         server_addr.sin_family = AF_INET;
  46.         server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  47.         server_addr.sin_port = htons(5005);
  48.         connect(sock, (sockaddr *)&server_addr, sizeof(server_addr));
  49.         ::send(sock, to_string(dist(mt)).c_str(), 64, 0);
  50.     }
  51.     ~Network() {
  52.         closesocket(sock);
  53.         WSACleanup();
  54.     }
  55.     int send(string s) {
  56.         ::send(sock, s.c_str(), s.length(), 0);
  57.         return 0;
  58.     }
  59.     string receive() {
  60.         char recv_buff[1024];
  61.         auto len = recv(sock, &recv_buff[0], sizeof(recv_buff) - 1, 0);
  62.         if (len == -1)
  63.             return 0;
  64.         recv_buff[len] = '\0';
  65.         string s = recv_buff;
  66.         return s;
  67.     }
  68. }network;
  69.  
  70. string tp_to_str(system_clock::time_point _tp) {
  71.     return to_string(time_point_cast<milliseconds>(_tp).time_since_epoch().count());
  72. }
  73.  
  74. class Commands {
  75. private:
  76.     map<string, int(Commands::*)(smatch)> command_list;
  77.     int sms(smatch input) {
  78.         auto tp = system_clock::now();
  79.         regex pattern(R"(\-d|(\+?[0-9]+))");
  80.         if (!regex_match(input.str(2), pattern))
  81.             return 1;
  82.         network.send(input.str(0) + " " + tp_to_str(tp));
  83.         return 0;
  84.     }
  85.     int del(smatch input) {
  86.         auto tp = system_clock::now();
  87.         regex pattern(R"(\+?[0-9]+)");
  88.         if (!regex_match(input.str(2), pattern))
  89.             return 1;
  90.         network.send(input.str(0) + " " + tp_to_str(tp));
  91.         return 0;
  92.     }
  93.     int exit() {
  94.         network.send("&client_exit");
  95.         return 0;
  96.     }
  97. public:
  98.     Commands() {
  99.         //command_list.emplace("exit", &Commands::exit);
  100.         //command_list.emplace("quit", &Commands::exit);
  101.         command_list.emplace("sms", &Commands::sms);
  102.         command_list.emplace("del", &Commands::del);
  103.     }
  104.     int exec(smatch input) {
  105.         command_list[input.str(1)];
  106.         return 0;
  107.     }
  108. }commands;
  109.  
  110. int input(SOCKET sock) {
  111.     string s;
  112.     while (true) {
  113.         getline(cin, s);
  114.         regex pattern(R"(^(".+"|[.\S]+)\s*(".*"|[.\S]*)\s*(".*"|[.\S]*)\s*(".*"|[.\S]*)\s*$)");
  115.         smatch match_results;
  116.         regex_match(s, match_results, pattern);
  117.         commands.exec(match_results);
  118.     }
  119.     return 0;
  120.     /*string s;
  121.     while (true) {
  122.         getline(cin, s);
  123.         if (s == "quit" || s == "exit") {
  124.             send(sock, "&client_exit", sizeof("&client_exit"), 0);
  125.             cvar.notify_one();
  126.             cvar_backup = true;
  127.             return 1;
  128.         }
  129.         auto tp = tp_to_str(system_clock::now());
  130.         auto command = s.substr(0, s.find(" "));
  131.         stringstream ss;
  132.         ss << s.substr(s.find(" ") + 1, s.length());
  133.         if (command == "sms") {                    
  134.             string deletable, dest_num, text;
  135.             ss >> deletable >> dest_num >> text;
  136.             if (deletable != "-d" && deletable != "-nd" || dest_num == "" || text == "") {
  137.                 cout << "Invalid parameters" << endl;
  138.                 continue;
  139.             }
  140.             send(sock, "&message_new", sizeof("&message_new"), 0);
  141.             send(sock, tp.c_str(), sizeof(tp.c_str()), 0);
  142.             send(sock, deletable.c_str(), sizeof(deletable.c_str()), 0);
  143.             send(sock, dest_num.c_str(), sizeof(dest_num.c_str()), 0);
  144.             send(sock, text.c_str(), sizeof(text.c_str()), 0);
  145.             continue;
  146.         }
  147.         if (command == "del") {
  148.             string dest_num;
  149.             ss >> dest_num;
  150.             send(sock, "&message_delete", sizeof("&message_delete"), 0);
  151.             send(sock, tp.c_str(), sizeof(tp.c_str()), 0);
  152.             send(sock, dest_num.c_str(), sizeof(dest_num.c_str()), 0);
  153.             continue;
  154.         }
  155.         cout << "Unknown command" << endl;
  156.     }
  157.     return 0;*/
  158. }
  159.  
  160. int receive(SOCKET sock) {
  161.     /*while (true) {
  162.         char recv_buff[1024];
  163.         auto len = recv(sock, &recv_buff[0], sizeof(recv_buff) - 1, 0);
  164.         if (len == -1)
  165.             return 1;
  166.         recv_buff[len] = '\0';
  167.         string ans = recv_buff;
  168.         if (ans == "&message_delete_success") {
  169.             cout << "Message deleted successfully" << endl;
  170.             continue;
  171.         }
  172.         if (ans == "&message_delete_failed") {
  173.             cout << "Message delete failed" << endl;
  174.             continue;
  175.         }
  176.     }*/
  177.     return 0;
  178. }
  179.  
  180. int main()
  181. {
  182.     /*WSAData wsadata;
  183.     WSAStartup(0x0202, &wsadata);
  184.     SOCKET sock;
  185.     sock = socket(AF_INET, SOCK_STREAM, 0);
  186.     sockaddr_in server_addr;
  187.     server_addr.sin_family = AF_INET;
  188.     server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  189.     server_addr.sin_port = htons(5005);
  190.     connect(sock, (sockaddr *)&server_addr, sizeof(server_addr));
  191.     send(sock, to_string(dist(mt)).c_str(), 64, 0);
  192.     thread listen(receive, sock);
  193.     thread input(input, sock);
  194.     unique_lock<mutex> locked(m);
  195.     cvar.wait(locked, [] {return cvar_backup; });
  196.     closesocket(sock);
  197.     if (input.joinable())
  198.         input.join();
  199.     if (listen.joinable())
  200.         listen.join();
  201.     WSACleanup();*/
  202.     return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment