Advertisement
dark-Matter

TCPServer.cpp

Nov 22nd, 2020
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.84 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <unistd.h>
  3. #include <cstring>      // Needed for memset
  4. #include <sys/socket.h> // Needed for the socket functions
  5. #include <netdb.h>      // Needed for the socket functions
  6. #include <netinet/in.h> // Needed for internet addresses
  7. #include "Server.hpp"
  8.  
  9. using namespace std;
  10.  
  11. map<string, vector<Question>> topic_questions;
  12. map<string, int> active_users; // <userd id , active count>
  13.  
  14. class ServerSocket {
  15.     private:
  16.     int socket_fd, port;
  17.     struct sockaddr_in server_address, client_address;
  18.     socklen_t client_address_length;
  19.     map<int, ClientBuffers> client_buffers; // <client_socket_id , buffers>
  20.     int buffer_size;
  21.  
  22.     public:
  23.     ServerSocket(int port, int buffer_size){
  24.         this->port = port;
  25.         this->buffer_size = buffer_size;
  26.         bzero(&server_address, sizeof(server_address));
  27.  
  28.         server_address.sin_family = AF_INET;
  29.         server_address.sin_addr.s_addr = htonl(INADDR_ANY);
  30.         server_address.sin_port = htons(port);
  31.  
  32.         socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  33.     }
  34.  
  35.     int _listen(int max_connections){
  36.         int bind_result = bind(socket_fd,
  37.                                 (struct sockaddr *)&server_address,
  38.                                 sizeof(server_address));
  39.         int listen_result = listen(socket_fd, max_connections);
  40.         if (bind_result || listen_result) return -1;
  41.         return listen_result;
  42.     }
  43.     int _accept() {
  44.         client_address_length = sizeof(client_address_length);
  45.         int client_socket_fd = accept(socket_fd, (struct sockaddr *)&client_address,
  46.                                         &client_address_length);
  47.         if (client_socket_fd == -1) return -1;
  48.         setup_client(client_socket_fd);
  49.         return client_socket_fd;
  50.     }
  51.     void setup_client(int client_socket_fd) {
  52.         client_buffers[client_socket_fd] = ClientBuffers(buffer_size);
  53.     }
  54.     void remove_client(int client_socket_fd) {
  55.         client_buffers[client_socket_fd]._free();
  56.         client_buffers.erase(client_socket_fd);
  57.     }
  58.  
  59.     string get_message(int client_socket_fd) {
  60.         char *header = client_buffers[client_socket_fd].read_header;
  61.         char *read_buffer = client_buffers[client_socket_fd].read_buffer;
  62.         memset(header, 0, sizeof(header));
  63.         int read_result = -1;
  64.         read_result = read(client_socket_fd, header, 16);
  65.         cout << read_result << endl;
  66.         if (read_result > 0){
  67.             int read_size = stoi(string(header));
  68.             cout << read_size << endl;
  69.             memset(read_buffer, 0, sizeof(read_buffer));
  70.             read_result = read(client_socket_fd, read_buffer,read_size);
  71.             if (read_result > 0) return string(read_buffer).substr(0,read_size);
  72.         }
  73.         cerr << "Unable to recieve message from client socket " << client_socket_fd << endl;
  74.         return "";
  75.     }
  76.     int _send(int client_socket_fd, string message) {
  77.         char *header = client_buffers[client_socket_fd].write_header;
  78.         char *write_buffer = client_buffers[client_socket_fd].write_buffer;
  79.  
  80.         memset(header, 0, sizeof(header));
  81.         string write_size = to_string(message.length());
  82.         copy(write_size.begin(), write_size.end(), header);
  83.         int write_result = write(client_socket_fd, header, 16); // sending size of message
  84.  
  85.         if (write_result > 0) {
  86.             write_result = write(client_socket_fd, message.c_str(), message.length());
  87.         }
  88.         if (write_result <= 0)
  89.             cerr << "Unable to send to client socket fd : " << client_socket_fd << endl;
  90.         return write_result;
  91.     }
  92.  
  93.     void _close() {
  94.         for (auto i : client_buffers) i.second._free();
  95.         close(socket_fd);
  96.     }
  97.  
  98.     ~ServerSocket(){
  99.         _close();
  100.     }
  101. };
  102.  
  103. void ask_questions(ServerSocket server_socket, int client_socket_fd) {
  104.     string header = server_socket.get_message(client_socket_fd);
  105.     cout << "client header"<<header << endl;
  106.     vector<string> splits = split_str(header, '|');
  107.     string user_id = splits[0];
  108.     string request_type = splits[1];
  109.     if (request_type == "get_ques") {
  110.         int score = 0;
  111.         string mode = splits[2];
  112.         if (mode == "A") {
  113.             string topic = splits[3];
  114.             for (Question i : topic_questions[topic]) {
  115.                 server_socket._send(client_socket_fd,i.serialize());
  116.                 string ans = server_socket.get_message(client_socket_fd);
  117.                 bool correct = (ans[0]-'A' == ANSWER[i.get_id()].first);
  118.                 if (correct) score++;
  119.                 server_socket._send(client_socket_fd,serialize_answer(ANSWER[i.get_id()]));
  120.             }
  121.             server_socket._send(client_socket_fd, "stream-end");
  122.         }
  123.     }
  124. }
  125.  
  126. string serialize_active_users() {
  127.     string s = "";
  128.     for (auto i : active_users) s += i.first + "-";
  129.     return s;
  130. }
  131.  
  132. int main()
  133. {
  134.     topic_questions["T"] = read_questions("Questions/threads.txt");
  135.     ServerSocket server_socket = ServerSocket(PORT, BUFFER_SIZE);
  136.     int available = server_socket._listen(5);
  137.     if (available == -1) {
  138.         cerr << "Unable to listen to the port" << endl;
  139.         return 1;
  140.     }
  141.     cout << "Listening at port: " << PORT << endl;
  142.  
  143.     while (1) {
  144.         int client_socket_fd = server_socket._accept();
  145.         if (client_socket_fd == -1) continue;
  146.         cout << "Connected to client socket fd : " << client_socket_fd << endl;
  147.         string user_id = split_str(server_socket.get_message(client_socket_fd), '|')[0];
  148.         cout << "User id " << user_id << '\n';
  149.         if (active_users.count(user_id)) active_users[user_id]++;
  150.         else active_users[user_id] = 1;
  151.         ask_questions(server_socket, client_socket_fd);
  152.         active_users[user_id]--;
  153.         server_socket.remove_client(client_socket_fd);
  154.     }
  155.     server_socket._close();
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement