Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // cn-lab5-client.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #define _WINSOCK_DEPRECATED_NO_WARNINGS
- #include <chrono>
- #include <condition_variable>
- #include <iostream>
- #include <limits>
- #include <map>
- #include <random>
- #include <regex>
- #include <string>
- #include <thread>
- #include <winsock2.h>
- #pragma comment(lib, "ws2_32.lib")
- #undef max
- using namespace std;
- using namespace std::chrono;
- typedef unsigned long long ull;
- typedef time_point<system_clock, milliseconds> timepoint;
- mutex m;
- condition_variable cvar;
- bool cvar_backup;
- random_device rd;
- mt19937 mt(rd());
- uniform_int_distribution<ull> dist(1, numeric_limits<ull>::max());
- class Network {
- private:
- SOCKET sock;
- sockaddr_in server_addr;
- public:
- Network() {
- WSAData wsadata;
- WSAStartup(0x0202, &wsadata);
- SOCKET sock;
- sock = socket(AF_INET, SOCK_STREAM, 0);
- this->sock = sock;
- sockaddr_in server_addr;
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
- server_addr.sin_port = htons(5005);
- connect(sock, (sockaddr *)&server_addr, sizeof(server_addr));
- ::send(sock, to_string(dist(mt)).c_str(), 64, 0);
- }
- ~Network() {
- closesocket(sock);
- WSACleanup();
- }
- int send(string s) {
- ::send(sock, s.c_str(), s.length(), 0);
- return 0;
- }
- string receive() {
- char recv_buff[1024];
- auto len = recv(sock, &recv_buff[0], sizeof(recv_buff) - 1, 0);
- if (len == -1)
- return 0;
- recv_buff[len] = '\0';
- string s = recv_buff;
- return s;
- }
- }network;
- string tp_to_str(system_clock::time_point _tp) {
- return to_string(time_point_cast<milliseconds>(_tp).time_since_epoch().count());
- }
- class Commands {
- private:
- map<string, int(Commands::*)(smatch)> command_list;
- int sms(smatch input) {
- auto tp = system_clock::now();
- regex pattern(R"(\-d|(\+?[0-9]+))");
- if (!regex_match(input.str(2), pattern))
- return 1;
- network.send(input.str(0) + " " + tp_to_str(tp));
- return 0;
- }
- int del(smatch input) {
- auto tp = system_clock::now();
- regex pattern(R"(\+?[0-9]+)");
- if (!regex_match(input.str(2), pattern))
- return 1;
- network.send(input.str(0) + " " + tp_to_str(tp));
- return 0;
- }
- int exit() {
- network.send("&client_exit");
- return 0;
- }
- public:
- Commands() {
- //command_list.emplace("exit", &Commands::exit);
- //command_list.emplace("quit", &Commands::exit);
- command_list.emplace("sms", &Commands::sms);
- command_list.emplace("del", &Commands::del);
- }
- int exec(smatch input) {
- command_list[input.str(1)];
- return 0;
- }
- }commands;
- int input(SOCKET sock) {
- string s;
- while (true) {
- getline(cin, s);
- regex pattern(R"(^(".+"|[.\S]+)\s*(".*"|[.\S]*)\s*(".*"|[.\S]*)\s*(".*"|[.\S]*)\s*$)");
- smatch match_results;
- regex_match(s, match_results, pattern);
- commands.exec(match_results);
- }
- return 0;
- /*string s;
- while (true) {
- getline(cin, s);
- if (s == "quit" || s == "exit") {
- send(sock, "&client_exit", sizeof("&client_exit"), 0);
- cvar.notify_one();
- cvar_backup = true;
- return 1;
- }
- auto tp = tp_to_str(system_clock::now());
- auto command = s.substr(0, s.find(" "));
- stringstream ss;
- ss << s.substr(s.find(" ") + 1, s.length());
- if (command == "sms") {
- string deletable, dest_num, text;
- ss >> deletable >> dest_num >> text;
- if (deletable != "-d" && deletable != "-nd" || dest_num == "" || text == "") {
- cout << "Invalid parameters" << endl;
- continue;
- }
- send(sock, "&message_new", sizeof("&message_new"), 0);
- send(sock, tp.c_str(), sizeof(tp.c_str()), 0);
- send(sock, deletable.c_str(), sizeof(deletable.c_str()), 0);
- send(sock, dest_num.c_str(), sizeof(dest_num.c_str()), 0);
- send(sock, text.c_str(), sizeof(text.c_str()), 0);
- continue;
- }
- if (command == "del") {
- string dest_num;
- ss >> dest_num;
- send(sock, "&message_delete", sizeof("&message_delete"), 0);
- send(sock, tp.c_str(), sizeof(tp.c_str()), 0);
- send(sock, dest_num.c_str(), sizeof(dest_num.c_str()), 0);
- continue;
- }
- cout << "Unknown command" << endl;
- }
- return 0;*/
- }
- int receive(SOCKET sock) {
- /*while (true) {
- char recv_buff[1024];
- auto len = recv(sock, &recv_buff[0], sizeof(recv_buff) - 1, 0);
- if (len == -1)
- return 1;
- recv_buff[len] = '\0';
- string ans = recv_buff;
- if (ans == "&message_delete_success") {
- cout << "Message deleted successfully" << endl;
- continue;
- }
- if (ans == "&message_delete_failed") {
- cout << "Message delete failed" << endl;
- continue;
- }
- }*/
- return 0;
- }
- int main()
- {
- /*WSAData wsadata;
- WSAStartup(0x0202, &wsadata);
- SOCKET sock;
- sock = socket(AF_INET, SOCK_STREAM, 0);
- sockaddr_in server_addr;
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
- server_addr.sin_port = htons(5005);
- connect(sock, (sockaddr *)&server_addr, sizeof(server_addr));
- send(sock, to_string(dist(mt)).c_str(), 64, 0);
- thread listen(receive, sock);
- thread input(input, sock);
- unique_lock<mutex> locked(m);
- cvar.wait(locked, [] {return cvar_backup; });
- closesocket(sock);
- if (input.joinable())
- input.join();
- if (listen.joinable())
- listen.join();
- WSACleanup();*/
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment