Advertisement
dark-Matter

TCPClient.cpp

Nov 22nd, 2020 (edited)
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.95 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>
  7. #include <arpa/inet.h>
  8. #include "common_utils.hpp"
  9.  
  10. using namespace std;
  11.  
  12. string user_id;
  13. bool loggedin = false;
  14. bool available = true;
  15.  
  16. template<typename T>
  17. T cli_input(){
  18.     T var;
  19.     cout << "#> ";
  20.     cin >> var;
  21.     return var;
  22. }
  23.  
  24. string Question::ask() {
  25.     cout << "#> " << question << endl;
  26.     for (int i = 0; i < options.size(); i++)
  27.         printf("  %c : %s\n", 'A'+i, options[i].c_str());
  28.     return cli_input<string>();
  29. }
  30.  
  31. string make_header(string type, string data) { // type = "get_ques:T" , "post_ans"
  32.     string header = user_id + "|" + type +"|"+ data;
  33.     return header;
  34. }
  35.  
  36. class ClientSocket {
  37.     private:
  38.     struct sockaddr_in client_address, server_address;
  39.     int socket_fd;
  40.     socklen_t client_address_length, server_address_length;
  41.     char *recieve_buffer;
  42.     char *send_buffer;
  43.     int buffer_size;
  44.     char read_header[16];
  45.     char write_header[16];
  46.  
  47.     public:
  48.     ClientSocket(string ip_address, int port, int buffer_size){
  49.         recieve_buffer = (char*)malloc(sizeof(char)*buffer_size);
  50.         send_buffer = (char*)malloc(sizeof(char)*buffer_size);
  51.         this->buffer_size = buffer_size;
  52.         server_address.sin_family = AF_INET;
  53.         server_address.sin_port = htons(port);
  54.         if (inet_pton(AF_INET, ip_address.c_str(), &server_address.sin_addr) <= 0)
  55.             cerr << "Cannot connnect : Invalid IP Address\n";
  56.         socket_fd = socket(AF_INET, SOCK_STREAM, 0);
  57.     }
  58.     int _connect(){
  59.         int connect_result = connect(socket_fd, (struct sockaddr *)&server_address,
  60.                                      sizeof(server_address));
  61.         return connect_result;
  62.     }
  63.  
  64.     int get_socket_fd() {return socket_fd;}
  65.  
  66.     int _send(string message) {
  67.         memset(write_header, 0, sizeof(write_header));
  68.         string s = to_string(message.length());
  69.         copy(s.begin(),s.end(), write_header);
  70.         int write_result = write(socket_fd, write_header, 16);
  71.         if (write_result > 0)
  72.             write_result = write(socket_fd, message.c_str(), message.length());
  73.         if (write_result <=0) cerr << "Unable to send message : "<< message  << endl;
  74.         return write_result;
  75.     }
  76.  
  77.     string _recieve(){
  78.         memset(read_header, 0, sizeof(read_header));
  79.         int read_result = read(socket_fd, read_header, 16);
  80.         if (read_result >0) {
  81.             int read_size = stoi(string(read_header));
  82.             memset(recieve_buffer, 0, sizeof(recieve_buffer));
  83.             read_result = read(socket_fd, recieve_buffer, read_size);
  84.         }
  85.         if ( read_result > 0) return string(recieve_buffer);
  86.         cerr << "Unable to read from server." << endl;
  87.         return "";
  88.     }
  89.     void _close(){
  90.         close(socket_fd);
  91.     }
  92.     ~ClientSocket(){
  93.         close(socket_fd);
  94.     }
  95. };
  96.  
  97. int login(ClientSocket client_socket) {
  98.     if (client_socket._connect() >= 0) {
  99.         cout << "Enter User id: ";
  100.         user_id = cli_input<string> ();
  101.         client_socket._send(make_header("user_id", user_id));
  102.     }
  103.     else {
  104.         cerr << "Unable to connect to the server" << endl;
  105.         return -1;
  106.     }
  107.     return 0;
  108. }
  109.  
  110. void cli_init(ClientSocket client_socket){
  111.     cout << "Welcome to Quizar, An online quizzing platform." << endl;
  112.     if (!loggedin) {
  113.         if (login(client_socket)) return;
  114.         loggedin = true;
  115.     }
  116.     cout << "Select mode:\n G for group\n I for individual\n A for Admin\n";
  117.     string mode = cli_input<string>();
  118.     if (mode == "A") {
  119.         cout << "Select topic:\n T for threads\n O for OS\n N for networks\n";
  120.         string topic = cli_input<string>();
  121.         client_socket._send(make_header("get_ques",mode+"|"+topic)); // unable to send aa rha hai
  122.         cout << "Visited" << endl;
  123.         string message = client_socket._recieve();
  124.         while (message != "stream-end") {
  125.             Question ques = deserialize_question(message);
  126.             string answered = ques.ask();
  127.             client_socket._send(answered);
  128.             int ans; string explaination;
  129.             deserialize_answer(client_socket._recieve(), &ans, &explaination);
  130.             if (ans == answered[0]-'A') cout << "Correct ";
  131.             else cout << "Wrong ";
  132.             cout << "Correct answer : " << ques.get_option(ans) << endl;
  133.             cout << "Explaintaion :" << explaination << endl;
  134.             message = client_socket._recieve();
  135.         }
  136.     }
  137. }
  138.  
  139. int main()
  140. {
  141.     ClientSocket client_socket = ClientSocket(IP_ADDRESS, PORT, BUFFER_SIZE);
  142.     /**
  143.     pid_t pid;
  144.     pid = fork();
  145.     if (pid == 0) {
  146.         while (available) {
  147.             available = (client_socket._send("available"));
  148.         }
  149.     }
  150.     **/
  151.     cli_init(client_socket);
  152.     client_socket._close();
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement