Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <unistd.h>
- #include <cstring> // Needed for memset
- #include <sys/socket.h> // Needed for the socket functions
- #include <netdb.h> // Needed for the socket functions
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include "common_utils.hpp"
- using namespace std;
- string user_id;
- bool loggedin = false;
- bool available = true;
- template<typename T>
- T cli_input(){
- T var;
- cout << "#> ";
- cin >> var;
- return var;
- }
- string Question::ask() {
- cout << "#> " << question << endl;
- for (int i = 0; i < options.size(); i++)
- printf(" %c : %s\n", 'A'+i, options[i].c_str());
- return cli_input<string>();
- }
- string make_header(string type, string data) { // type = "get_ques:T" , "post_ans"
- string header = user_id + "|" + type +"|"+ data;
- return header;
- }
- class ClientSocket {
- private:
- struct sockaddr_in client_address, server_address;
- int socket_fd;
- socklen_t client_address_length, server_address_length;
- char *recieve_buffer;
- char *send_buffer;
- int buffer_size;
- char read_header[16];
- char write_header[16];
- public:
- ClientSocket(string ip_address, int port, int buffer_size){
- recieve_buffer = (char*)malloc(sizeof(char)*buffer_size);
- send_buffer = (char*)malloc(sizeof(char)*buffer_size);
- this->buffer_size = buffer_size;
- server_address.sin_family = AF_INET;
- server_address.sin_port = htons(port);
- if (inet_pton(AF_INET, ip_address.c_str(), &server_address.sin_addr) <= 0)
- cerr << "Cannot connnect : Invalid IP Address\n";
- socket_fd = socket(AF_INET, SOCK_STREAM, 0);
- }
- int _connect(){
- int connect_result = connect(socket_fd, (struct sockaddr *)&server_address,
- sizeof(server_address));
- return connect_result;
- }
- int get_socket_fd() {return socket_fd;}
- int _send(string message) {
- memset(write_header, 0, sizeof(write_header));
- string s = to_string(message.length());
- copy(s.begin(),s.end(), write_header);
- int write_result = write(socket_fd, write_header, 16);
- if (write_result > 0)
- write_result = write(socket_fd, message.c_str(), message.length());
- if (write_result <=0) cerr << "Unable to send message : "<< message << endl;
- return write_result;
- }
- string _recieve(){
- memset(read_header, 0, sizeof(read_header));
- int read_result = read(socket_fd, read_header, 16);
- if (read_result >0) {
- int read_size = stoi(string(read_header));
- memset(recieve_buffer, 0, sizeof(recieve_buffer));
- read_result = read(socket_fd, recieve_buffer, read_size);
- }
- if ( read_result > 0) return string(recieve_buffer);
- cerr << "Unable to read from server." << endl;
- return "";
- }
- void _close(){
- close(socket_fd);
- }
- ~ClientSocket(){
- close(socket_fd);
- }
- };
- int login(ClientSocket client_socket) {
- if (client_socket._connect() >= 0) {
- cout << "Enter User id: ";
- user_id = cli_input<string> ();
- client_socket._send(make_header("user_id", user_id));
- }
- else {
- cerr << "Unable to connect to the server" << endl;
- return -1;
- }
- return 0;
- }
- void cli_init(ClientSocket client_socket){
- cout << "Welcome to Quizar, An online quizzing platform." << endl;
- if (!loggedin) {
- if (login(client_socket)) return;
- loggedin = true;
- }
- cout << "Select mode:\n G for group\n I for individual\n A for Admin\n";
- string mode = cli_input<string>();
- if (mode == "A") {
- cout << "Select topic:\n T for threads\n O for OS\n N for networks\n";
- string topic = cli_input<string>();
- client_socket._send(make_header("get_ques",mode+"|"+topic)); // unable to send aa rha hai
- cout << "Visited" << endl;
- string message = client_socket._recieve();
- while (message != "stream-end") {
- Question ques = deserialize_question(message);
- string answered = ques.ask();
- client_socket._send(answered);
- int ans; string explaination;
- deserialize_answer(client_socket._recieve(), &ans, &explaination);
- if (ans == answered[0]-'A') cout << "Correct ";
- else cout << "Wrong ";
- cout << "Correct answer : " << ques.get_option(ans) << endl;
- cout << "Explaintaion :" << explaination << endl;
- message = client_socket._recieve();
- }
- }
- }
- int main()
- {
- ClientSocket client_socket = ClientSocket(IP_ADDRESS, PORT, BUFFER_SIZE);
- /**
- pid_t pid;
- pid = fork();
- if (pid == 0) {
- while (available) {
- available = (client_socket._send("available"));
- }
- }
- **/
- cli_init(client_socket);
- client_socket._close();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement