Merge branch 'networking' of beta/shape-game into master
This commit is contained in:
commit
75423afd94
1
.vscode/c_cpp_properties.json
vendored
1
.vscode/c_cpp_properties.json
vendored
@ -6,6 +6,7 @@
|
|||||||
"c:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include",
|
"c:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include",
|
||||||
"L:/SDL2-2.0.5/include",
|
"L:/SDL2-2.0.5/include",
|
||||||
"L:/SDL2-2.0.5/include/SDL2",
|
"L:/SDL2-2.0.5/include/SDL2",
|
||||||
|
"${workspaceRoot}/includes/",
|
||||||
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.10150.0/ucrt",
|
"C:/Program Files (x86)/Windows Kits/10/Include/10.0.10150.0/ucrt",
|
||||||
"C:/Program Files (x86)/Windows Kits/8.1/Include/um/gl"
|
"C:/Program Files (x86)/Windows Kits/8.1/Include/um/gl"
|
||||||
],
|
],
|
||||||
|
58
.vscode/settings.json
vendored
58
.vscode/settings.json
vendored
@ -3,6 +3,62 @@
|
|||||||
"*.cl": "c",
|
"*.cl": "c",
|
||||||
"*.tpl": "html",
|
"*.tpl": "html",
|
||||||
"*.cool": "java",
|
"*.cool": "java",
|
||||||
"cmath": "cpp"
|
"cmath": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"array": "cpp",
|
||||||
|
"*.tcc": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"vector": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"fstream": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"iostream": "cpp",
|
||||||
|
"istream": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"sstream": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"thread": "cpp",
|
||||||
|
"cinttypes": "cpp",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"typeinfo": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"ios": "cpp",
|
||||||
|
"new": "cpp",
|
||||||
|
"string": "cpp",
|
||||||
|
"xfacet": "cpp",
|
||||||
|
"xfunctional": "cpp",
|
||||||
|
"xiosbase": "cpp",
|
||||||
|
"xlocale": "cpp",
|
||||||
|
"xlocinfo": "cpp",
|
||||||
|
"xlocnum": "cpp",
|
||||||
|
"xmemory": "cpp",
|
||||||
|
"xmemory0": "cpp",
|
||||||
|
"xstddef": "cpp",
|
||||||
|
"xstring": "cpp",
|
||||||
|
"xtr1common": "cpp",
|
||||||
|
"xutility": "cpp",
|
||||||
|
"xthread": "cpp",
|
||||||
|
"map": "cpp",
|
||||||
|
"xtree": "cpp"
|
||||||
}
|
}
|
||||||
}
|
}
|
70
includes/client.hpp
Normal file
70
includes/client.hpp
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#ifndef __BETACORE_CLIENT_HPP__
|
||||||
|
#define __BETACORE_CLIENT_HPP__
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <functional>
|
||||||
|
#include <sstream>
|
||||||
|
#include <vector>
|
||||||
|
#include <thread>
|
||||||
|
#include <map>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "common.hpp"
|
||||||
|
|
||||||
|
namespace betacore
|
||||||
|
{
|
||||||
|
|
||||||
|
class Client
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool _online = false;
|
||||||
|
bool _running = false;
|
||||||
|
char key = 'Z';
|
||||||
|
int _port;
|
||||||
|
std::string _url;
|
||||||
|
MODE _mode;
|
||||||
|
int _client_socket;
|
||||||
|
std::function<void(SHAPE &S, MODE &M)> _update;
|
||||||
|
struct sockaddr_in _server_address;
|
||||||
|
struct hostent *_server;
|
||||||
|
std::map<std::string, std::string> lookup;
|
||||||
|
std::vector<std::string> explode(std::string &message);
|
||||||
|
std::string encode(const SHAPE &shape);
|
||||||
|
std::string crypt(const std::string &shape);
|
||||||
|
|
||||||
|
std::string raw(const SHAPE &shape);
|
||||||
|
SHAPE parse(const std::string &message);
|
||||||
|
|
||||||
|
SHAPE decode(const std::string &message);
|
||||||
|
/**
|
||||||
|
* Function for Thread for getting information from server
|
||||||
|
*/
|
||||||
|
void listener();
|
||||||
|
/**
|
||||||
|
* Function for Thread for sending to server
|
||||||
|
*/
|
||||||
|
void sender();
|
||||||
|
void start();
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
public:
|
||||||
|
Client(
|
||||||
|
MODE mode,
|
||||||
|
int port,
|
||||||
|
std::string url,
|
||||||
|
std::function<void(SHAPE &S, MODE &M)> &update);
|
||||||
|
~Client();
|
||||||
|
void kill();
|
||||||
|
bool running();
|
||||||
|
void send(bool encrypt, SHAPE shape);
|
||||||
|
};
|
||||||
|
} // namespace betacore
|
||||||
|
#endif
|
91
includes/common.hpp
Normal file
91
includes/common.hpp
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
#ifndef __BETACORE_COMMON_HPP__
|
||||||
|
#define __BETACORE_COMMON_HPP__
|
||||||
|
|
||||||
|
#define BUFFER_LENGTH 1024
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
namespace betacore
|
||||||
|
{
|
||||||
|
|
||||||
|
enum SHAPE
|
||||||
|
{
|
||||||
|
NONE,
|
||||||
|
TRIANGLE,
|
||||||
|
CIRCLE,
|
||||||
|
SQUARE,
|
||||||
|
PENTAGON,
|
||||||
|
UNKOWN
|
||||||
|
};
|
||||||
|
enum MODE
|
||||||
|
{
|
||||||
|
ALICE,
|
||||||
|
BOB,
|
||||||
|
EVE,
|
||||||
|
END
|
||||||
|
};
|
||||||
|
class Parser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static std::string mode(MODE &mode)
|
||||||
|
{
|
||||||
|
switch (mode)
|
||||||
|
{
|
||||||
|
case ALICE:
|
||||||
|
return "ALICE";
|
||||||
|
case BOB:
|
||||||
|
return "BOB";
|
||||||
|
case EVE:
|
||||||
|
return "EVE";
|
||||||
|
default:
|
||||||
|
return "END";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static MODE mode(const std::string &mode)
|
||||||
|
{
|
||||||
|
if (mode == "ALICE")
|
||||||
|
return ALICE;
|
||||||
|
if (mode == "BOB")
|
||||||
|
return BOB;
|
||||||
|
return END;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SHAPE shape(const std::string &shape)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (shape == "TRIANGLE")
|
||||||
|
return TRIANGLE;
|
||||||
|
if (shape == "CIRCLE")
|
||||||
|
return CIRCLE;
|
||||||
|
if (shape == "SQUARE")
|
||||||
|
return SQUARE;
|
||||||
|
if (shape == "PENTAGON")
|
||||||
|
return PENTAGON;
|
||||||
|
return UNKOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string shape(const SHAPE &shape)
|
||||||
|
{
|
||||||
|
std::string message;
|
||||||
|
switch (shape)
|
||||||
|
{
|
||||||
|
case TRIANGLE:
|
||||||
|
message = "TRIANGLE";
|
||||||
|
break;
|
||||||
|
case CIRCLE:
|
||||||
|
message = "CIRCLE";
|
||||||
|
break;
|
||||||
|
case SQUARE:
|
||||||
|
message = "SQUARE";
|
||||||
|
break;
|
||||||
|
case PENTAGON:
|
||||||
|
message = "PENTAGON";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
message = "UNKOWN";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} // namespace betacore
|
||||||
|
#endif
|
@ -17,16 +17,12 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#define PI 3.14159265359
|
#define PI 3.14159265359
|
||||||
|
#include "common.hpp"
|
||||||
|
#include "client.hpp"
|
||||||
|
|
||||||
namespace betacore
|
namespace betacore
|
||||||
{
|
{
|
||||||
enum SHAPE{
|
|
||||||
NONE,
|
|
||||||
TRIANGLE,
|
|
||||||
CIRCLE,
|
|
||||||
SQUARE,
|
|
||||||
PENTAGON,
|
|
||||||
UNKOWN
|
|
||||||
};
|
|
||||||
class Game
|
class Game
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -37,11 +33,12 @@ private:
|
|||||||
const int SCREEN_HEIGHT = 600;
|
const int SCREEN_HEIGHT = 600;
|
||||||
int MONITOR_WIDTH=1920;
|
int MONITOR_WIDTH=1920;
|
||||||
int MONITOR_HEIGHT=1080;
|
int MONITOR_HEIGHT=1080;
|
||||||
const char *TITLE = "Lesson 01";
|
const char *TITLE ;
|
||||||
bool KEEP_ALIVE = true;
|
bool KEEP_ALIVE = true;
|
||||||
bool SHOW_GRID = false;
|
bool SHOW_GRID = false;
|
||||||
SHAPE USER_CURRENT = TRIANGLE;
|
SHAPE USER_CURRENT = NONE;
|
||||||
SHAPE GUST_CURRENT = UNKOWN;
|
SHAPE GUST_CURRENT = NONE;
|
||||||
|
MODE ME;
|
||||||
bool KEY_UP_ARROW_ACTIVE = false;
|
bool KEY_UP_ARROW_ACTIVE = false;
|
||||||
bool KEY_DOWN_ARROW_ACTIVE = false;
|
bool KEY_DOWN_ARROW_ACTIVE = false;
|
||||||
bool KEY_LEFT_ARROW_ACTIVE = false;
|
bool KEY_LEFT_ARROW_ACTIVE = false;
|
||||||
@ -49,8 +46,11 @@ private:
|
|||||||
bool KEY_SPACE_ACTIVE = false;
|
bool KEY_SPACE_ACTIVE = false;
|
||||||
bool KEY_RETURN_ACTIVE = false;
|
bool KEY_RETURN_ACTIVE = false;
|
||||||
bool FULL_SCREEN = false;
|
bool FULL_SCREEN = false;
|
||||||
|
Client* client = nullptr;
|
||||||
public:
|
public:
|
||||||
Game();
|
Game(MODE mode,
|
||||||
|
int port,
|
||||||
|
std::string url);
|
||||||
~Game();
|
~Game();
|
||||||
int init();
|
int init();
|
||||||
int initGL();
|
int initGL();
|
||||||
@ -73,7 +73,7 @@ public:
|
|||||||
void rectangle();
|
void rectangle();
|
||||||
void cross(bool filled);
|
void cross(bool filled);
|
||||||
void compass();
|
void compass();
|
||||||
|
|
||||||
void on_key_up_arrow();
|
void on_key_up_arrow();
|
||||||
void on_key_down_arrow();
|
void on_key_down_arrow();
|
||||||
void on_key_left_arrow();
|
void on_key_left_arrow();
|
||||||
@ -84,6 +84,8 @@ public:
|
|||||||
void top_screen();
|
void top_screen();
|
||||||
void user_screen();
|
void user_screen();
|
||||||
void guest_screen();
|
void guest_screen();
|
||||||
|
|
||||||
|
void update(SHAPE &s,MODE &m);
|
||||||
};
|
};
|
||||||
} // namespace betacore
|
} // namespace betacore
|
||||||
#endif
|
#endif
|
51
includes/server.hpp
Normal file
51
includes/server.hpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#ifndef __BETACORE_SERVER_HPP__
|
||||||
|
#define __BETACORE_SERVER_HPP__
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/poll.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <thread>
|
||||||
|
#include <utility>
|
||||||
|
#include <functional>
|
||||||
|
#include "common.hpp"
|
||||||
|
|
||||||
|
namespace betacore
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class Server
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
fd_set rset;
|
||||||
|
bool online = false;
|
||||||
|
bool server_running= false;
|
||||||
|
int port;
|
||||||
|
int server_socket;
|
||||||
|
std::vector<int> clients;
|
||||||
|
struct sockaddr_in server_address;
|
||||||
|
void start();
|
||||||
|
void shutdown();
|
||||||
|
void listener();
|
||||||
|
void read_socket(int client);
|
||||||
|
void forward_message(int client,char buffer[BUFFER_LENGTH] );
|
||||||
|
public:
|
||||||
|
Server(int port);
|
||||||
|
void off();
|
||||||
|
bool running();
|
||||||
|
|
||||||
|
};
|
||||||
|
} // namespace betacore
|
||||||
|
|
||||||
|
#endif
|
2
install.sh
Normal file
2
install.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
sudo apt-get install libsdl2-dev
|
||||||
|
sudo apt-get install freeglut3-dev
|
23
makefile
23
makefile
@ -1,14 +1,25 @@
|
|||||||
OUTPUT_DIR= bin
|
OUTPUT_DIR= bin
|
||||||
COMPILER = g++
|
COMPILER = g++
|
||||||
COMPILER_FLAGS=-w
|
COMPILER_FLAGS=-w -std=c++11
|
||||||
SOURCE_DIR = source/
|
SOURCE_DIR = source/
|
||||||
INCLUDES_DIR =-I includes/
|
INCLUDES_DIR =-I includes/
|
||||||
LINKER_FLAGS =-lSDL2 -lGL -lGLU
|
LINKER_FLAGS =-lSDL2 -lGL -lGLU -lpthread
|
||||||
|
LIBRARY_FLAGS= -std=c++11 -c -fPIC -shared
|
||||||
|
SERVER_LIB=$(OUTPUT_DIR)/server.so
|
||||||
|
CLIENT_LIB=$(OUTPUT_DIR)/client.so
|
||||||
|
all: game | driver
|
||||||
|
|
||||||
all: game
|
driver: client_driver | server_driver
|
||||||
|
|
||||||
game: $(SOURCE_DIR)game.cpp | make_dir
|
|
||||||
$(COMPILER) $(INCLUDES_DIR) $(SOURCE_DIR)game.cpp $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OUTPUT_DIR)/game
|
|
||||||
|
|
||||||
|
client_lib: $(SOURCE_DIR)client.cpp | make_dir
|
||||||
|
$(COMPILER) $(LIBRARY_FLAGS) $(INCLUDES_DIR) $(SOURCE_DIR)client.cpp -lpqxx -o $(CLIENT_LIB)
|
||||||
|
client_driver: $(SOURCE_DIR)client_driver.cpp | client_lib
|
||||||
|
$(COMPILER) $(INCLUDES_DIR) $(CLIENT_LIB) $(SOURCE_DIR)client_driver.cpp $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OUTPUT_DIR)/client.out
|
||||||
|
game: $(SOURCE_DIR)game.cpp | client_lib
|
||||||
|
$(COMPILER) $(INCLUDES_DIR) $(SOURCE_DIR)game.cpp $(CLIENT_LIB) $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OUTPUT_DIR)/game.out
|
||||||
|
server_lib: $(SOURCE_DIR)server.cpp | make_dir
|
||||||
|
$(COMPILER) $(LIBRARY_FLAGS) $(INCLUDES_DIR) $(SOURCE_DIR)server.cpp -lpqxx -o $(SERVER_LIB)
|
||||||
|
server_driver: $(SOURCE_DIR)server_driver.cpp | server_lib
|
||||||
|
$(COMPILER) $(INCLUDES_DIR) $(SERVER_LIB) $(SOURCE_DIR)server_driver.cpp $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OUTPUT_DIR)/server.out
|
||||||
make_dir:
|
make_dir:
|
||||||
mkdir -p $(OUTPUT_DIR)
|
mkdir -p $(OUTPUT_DIR)
|
||||||
|
2
run.sh
2
run.sh
@ -1,2 +1,2 @@
|
|||||||
export SDL_VIDEO_X11_VISUALID=
|
export SDL_VIDEO_X11_VISUALID=
|
||||||
./bin/game
|
./bin/game.out 1 4444 localhost
|
203
source/client.cpp
Normal file
203
source/client.cpp
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
#include "../includes/client.hpp"
|
||||||
|
|
||||||
|
namespace betacore
|
||||||
|
{
|
||||||
|
Client::Client(
|
||||||
|
MODE mode,
|
||||||
|
int port,
|
||||||
|
std::string url,
|
||||||
|
std::function<void(SHAPE &S, MODE &M)> &update) : _mode(mode),
|
||||||
|
_port(port),
|
||||||
|
_url(url),
|
||||||
|
_update(update)
|
||||||
|
{
|
||||||
|
|
||||||
|
lookup["TRIANGLE"] = "APPLE";
|
||||||
|
lookup["CIRCLE"] = "ORANGE";
|
||||||
|
lookup["SQUARE"] = "BANANA";
|
||||||
|
lookup["PENTAGON"] = "PINEAPPLE";
|
||||||
|
|
||||||
|
lookup["APPLE"] = "TRIANGLE";
|
||||||
|
lookup["ORANGE"] = "CIRCLE";
|
||||||
|
lookup["BANANA"] = "SQUARE";
|
||||||
|
lookup["PINEAPPLE"] = "PENTAGON";
|
||||||
|
this->start();
|
||||||
|
}
|
||||||
|
Client::~Client(){
|
||||||
|
this->_running= false;
|
||||||
|
this->_online=false;
|
||||||
|
}
|
||||||
|
void Client::start()
|
||||||
|
{
|
||||||
|
std::cout
|
||||||
|
<< "Start"
|
||||||
|
<< "\nConnecting to: " << _url << ":" << _port
|
||||||
|
<< std::endl;
|
||||||
|
//Create a socket point
|
||||||
|
this->_client_socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
_server = gethostbyname(_url.c_str());
|
||||||
|
if (_client_socket < 0)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR opening socket" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::cout
|
||||||
|
<< "Socket Open"
|
||||||
|
<< std::endl;
|
||||||
|
bzero((char *)&_server_address, sizeof(_server_address));
|
||||||
|
_server_address.sin_family = AF_INET;
|
||||||
|
|
||||||
|
bcopy(
|
||||||
|
(char *)_server->h_addr,
|
||||||
|
(char *)&_server_address.sin_addr.s_addr,
|
||||||
|
_server->h_length);
|
||||||
|
_server_address.sin_port = htons(_port);
|
||||||
|
|
||||||
|
// Now connect to the server
|
||||||
|
if (connect(
|
||||||
|
_client_socket,
|
||||||
|
(struct sockaddr *)&_server_address,
|
||||||
|
sizeof(_server_address)) < 0)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR connecting" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this->_online = true;
|
||||||
|
this->_running = true;
|
||||||
|
std::thread listen_thread([this] { this->listener(); });
|
||||||
|
listen_thread.detach();
|
||||||
|
|
||||||
|
std::cout
|
||||||
|
<< "Client Connected"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
void Client::stop()
|
||||||
|
{
|
||||||
|
std::cout
|
||||||
|
<< "Stop"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::kill()
|
||||||
|
{
|
||||||
|
std::cout
|
||||||
|
<< "Kill"
|
||||||
|
<< std::endl;
|
||||||
|
this->_online = false;
|
||||||
|
}
|
||||||
|
bool Client::running()
|
||||||
|
{
|
||||||
|
return this->_running;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> Client::explode(std::string &message){
|
||||||
|
std::stringstream stream(message);
|
||||||
|
std::string tmp;
|
||||||
|
std::vector<std::string> words;
|
||||||
|
while (std::getline(stream, tmp, ':'))
|
||||||
|
words.push_back(tmp);
|
||||||
|
return words;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHAPE Client::parse(const std::string &message)
|
||||||
|
{
|
||||||
|
SHAPE result = decode(message);
|
||||||
|
if (result != UNKOWN)
|
||||||
|
return result;
|
||||||
|
if (_mode == EVE)
|
||||||
|
return UNKOWN;
|
||||||
|
return decode(crypt(message));
|
||||||
|
}
|
||||||
|
SHAPE Client::decode(const std::string &shape)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (shape == "TRIANGLE")
|
||||||
|
return TRIANGLE;
|
||||||
|
if (shape == "CIRCLE")
|
||||||
|
return CIRCLE;
|
||||||
|
if (shape == "SQUARE")
|
||||||
|
return SQUARE;
|
||||||
|
if (shape == "PENTAGON")
|
||||||
|
return PENTAGON;
|
||||||
|
return UNKOWN;
|
||||||
|
}
|
||||||
|
std::string Client::crypt(const std::string &message)
|
||||||
|
{
|
||||||
|
|
||||||
|
// std::string output = std::string(message);
|
||||||
|
|
||||||
|
// for (int i = 0; i < message.size(); i++)
|
||||||
|
// output.at(i) = message[i] ^ key;
|
||||||
|
std::cout << "Crypt::" << message << " : " << lookup[message] << std::endl;
|
||||||
|
return lookup[message];
|
||||||
|
}
|
||||||
|
std::string Client::encode(const SHAPE &shape)
|
||||||
|
{
|
||||||
|
std::string message;
|
||||||
|
switch (shape)
|
||||||
|
{
|
||||||
|
case TRIANGLE:
|
||||||
|
message = "TRIANGLE";
|
||||||
|
break;
|
||||||
|
case CIRCLE:
|
||||||
|
message = "CIRCLE";
|
||||||
|
break;
|
||||||
|
case SQUARE:
|
||||||
|
message = "SQUARE";
|
||||||
|
break;
|
||||||
|
case PENTAGON:
|
||||||
|
message = "PENTAGON";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
message = "UNKOWN";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
void Client::send(bool encrypt, SHAPE shape)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string message = "SHAPE:";
|
||||||
|
message += encrypt ? crypt(encode(shape)) : encode(shape);
|
||||||
|
message += ":";
|
||||||
|
message += Parser::mode(this->_mode);
|
||||||
|
std::cout << "Sending Message: " << message << "\n"
|
||||||
|
<< std::endl;
|
||||||
|
char buffer[BUFFER_LENGTH];
|
||||||
|
bzero(buffer, BUFFER_LENGTH);
|
||||||
|
strcpy(buffer, message.c_str());
|
||||||
|
buffer[BUFFER_LENGTH - 1] = '\0';
|
||||||
|
int x = write(this->_client_socket, buffer, strlen(buffer));
|
||||||
|
if (x < 0)
|
||||||
|
{
|
||||||
|
std::cout << "Failed send to server" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Client::listener()
|
||||||
|
{
|
||||||
|
std::cout << "listener" << std::endl;
|
||||||
|
char buffer[BUFFER_LENGTH];
|
||||||
|
while (_online)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Now read server response
|
||||||
|
|
||||||
|
bzero(buffer, BUFFER_LENGTH);
|
||||||
|
std::cout << "Wating For message" << std::endl;
|
||||||
|
if (read(_client_socket, buffer, BUFFER_LENGTH - 1) < 0)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR reading from socket" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string message(buffer);
|
||||||
|
std::cout << "Got Message: " << message << std::endl;
|
||||||
|
auto parts = explode(message);
|
||||||
|
if(parts.size() < 3)
|
||||||
|
return;
|
||||||
|
SHAPE shape = parse(parts.at(1));
|
||||||
|
MODE mode = Parser::mode(parts.at(2));
|
||||||
|
_update(shape,mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // namespace betacore
|
31
source/client_driver.cpp
Normal file
31
source/client_driver.cpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#include "client.hpp"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
void test(betacore::SHAPE &s, betacore::MODE &m)
|
||||||
|
{
|
||||||
|
std::cout
|
||||||
|
<< "Got Shape::"
|
||||||
|
<< betacore::Parser::shape(s)
|
||||||
|
<< "\tFrom"
|
||||||
|
<< betacore::Parser::mode(m)
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
std::function<void(betacore::SHAPE & s, betacore::MODE & m)> fn = test;
|
||||||
|
betacore::Client client(betacore::ALICE, 4444, "localhost", fn);
|
||||||
|
client.send(false, betacore::TRIANGLE);
|
||||||
|
client.send(true, betacore::TRIANGLE);
|
||||||
|
//s.off();
|
||||||
|
//while(client.running()){}
|
||||||
|
std::string a;
|
||||||
|
while (client.running())
|
||||||
|
{
|
||||||
|
std::cin >> a;
|
||||||
|
client.send(false, betacore::TRIANGLE);
|
||||||
|
if (a == "q")
|
||||||
|
client.kill();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
195
source/game.cpp
195
source/game.cpp
@ -1,20 +1,40 @@
|
|||||||
#include "game.hpp"
|
#include "game.hpp"
|
||||||
|
void gluPerspective(double fovy,double aspect, double zNear, double zFar)
|
||||||
|
{
|
||||||
|
// Start in projection mode.
|
||||||
|
glMatrixMode(GL_PROJECTION);
|
||||||
|
glLoadIdentity();
|
||||||
|
double xmin, xmax, ymin, ymax;
|
||||||
|
ymax = zNear * tan(fovy * M_PI / 360.0);
|
||||||
|
ymin = -ymax;
|
||||||
|
xmin = ymin * aspect;
|
||||||
|
xmax = ymax * aspect;
|
||||||
|
glFrustum(xmin, xmax, ymin, ymax, zNear, zFar);
|
||||||
|
}
|
||||||
namespace betacore
|
namespace betacore
|
||||||
{
|
{
|
||||||
Game::Game()
|
Game::Game(MODE mode,
|
||||||
|
int port,
|
||||||
|
std::string url): ME(mode)
|
||||||
{
|
{
|
||||||
|
|
||||||
printf("%d\t%d\n", this->MONITOR_WIDTH,this->MONITOR_HEIGHT);
|
this->TITLE = Parser::mode(mode).c_str();
|
||||||
|
|
||||||
|
printf("%s\t%s\t%d\t%d\n",this->TITLE, Parser::mode(mode).c_str(),
|
||||||
|
this->MONITOR_WIDTH, this->MONITOR_HEIGHT);
|
||||||
if (init())
|
if (init())
|
||||||
{
|
{
|
||||||
printf("Error loading init\n");
|
printf("Error loading init\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
using namespace std::placeholders;
|
||||||
|
std::function<void(SHAPE & s, MODE & m)> fn =
|
||||||
|
std::bind(&Game::update, this, _1, _2);
|
||||||
|
this->client = new Client(mode, port, url, fn);
|
||||||
// SDL_DisplayMode DM;
|
// SDL_DisplayMode DM;
|
||||||
// SDL_GetCurrentDisplayMode(0, &DM);
|
// SDL_GetCurrentDisplayMode(0, &DM);
|
||||||
this->MONITOR_HEIGHT=1080;
|
this->MONITOR_HEIGHT = 1080;
|
||||||
this->MONITOR_WIDTH=1920;
|
this->MONITOR_WIDTH = 1920;
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
|
||||||
while (this->KEEP_ALIVE)
|
while (this->KEEP_ALIVE)
|
||||||
@ -25,8 +45,11 @@ Game::Game()
|
|||||||
}
|
}
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
Game::~Game() {
|
Game::~Game()
|
||||||
|
{
|
||||||
|
if (this->client != nullptr)
|
||||||
|
delete this->client;
|
||||||
|
this->client = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Game::init()
|
int Game::init()
|
||||||
@ -111,7 +134,7 @@ int Game::initGL()
|
|||||||
|
|
||||||
if (error != GL_NO_ERROR)
|
if (error != GL_NO_ERROR)
|
||||||
{
|
{
|
||||||
printf("OpenGL Error %s\n", gluErrorString(error));
|
printf("OpenGL Error %s\n");
|
||||||
result = -1;
|
result = -1;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -122,7 +145,6 @@ int Game::initGL()
|
|||||||
glViewport(0, 0, this->SCREEN_WIDTH, this->SCREEN_HEIGHT);
|
glViewport(0, 0, this->SCREEN_WIDTH, this->SCREEN_HEIGHT);
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
gluPerspective(
|
gluPerspective(
|
||||||
45.0f,
|
45.0f,
|
||||||
(GLfloat)this->SCREEN_WIDTH / (GLfloat)this->SCREEN_HEIGHT,
|
(GLfloat)this->SCREEN_WIDTH / (GLfloat)this->SCREEN_HEIGHT,
|
||||||
@ -245,8 +267,9 @@ void Game::rectangle()
|
|||||||
glVertex3f(-2.5f, -1.0f, 0.0f); // Bottom Left
|
glVertex3f(-2.5f, -1.0f, 0.0f); // Bottom Left
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
void Game::cross(bool filled){
|
void Game::cross(bool filled)
|
||||||
double width = 0.15;
|
{
|
||||||
|
double width = 0.15;
|
||||||
if (filled)
|
if (filled)
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
else
|
else
|
||||||
@ -278,43 +301,43 @@ void Game::compass()
|
|||||||
|
|
||||||
//MINI TRIANGLE
|
//MINI TRIANGLE
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glScalef(0.12f, 0.12f, 0.0f);
|
glScalef(0.12f, 0.12f, 0.0f);
|
||||||
glTranslatef(0.0f, 2.6f, 0.0f);
|
glTranslatef(0.0f, 2.6f, 0.0f);
|
||||||
this->triangle(this->KEY_UP_ARROW_ACTIVE);
|
this->triangle(this->KEY_UP_ARROW_ACTIVE);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
// MINI SQUARE
|
// MINI SQUARE
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glScalef(0.12f, 0.12f, 0.0f);
|
glScalef(0.12f, 0.12f, 0.0f);
|
||||||
glTranslatef(0.0f, -2.6f, 0.0f);
|
glTranslatef(0.0f, -2.6f, 0.0f);
|
||||||
this->square(this->KEY_DOWN_ARROW_ACTIVE);
|
this->square(this->KEY_DOWN_ARROW_ACTIVE);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
// MINI PENTAGON
|
// MINI PENTAGON
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glScalef(0.12f, 0.12f, 0.0f);
|
glScalef(0.12f, 0.12f, 0.0f);
|
||||||
glTranslatef(-2.56f, 0.0f, 0.0f);
|
glTranslatef(-2.56f, 0.0f, 0.0f);
|
||||||
this->pentagon(this->KEY_LEFT_ARROW_ACTIVE);
|
this->pentagon(this->KEY_LEFT_ARROW_ACTIVE);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
// MINI CIRCLE
|
// MINI CIRCLE
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glScalef(0.12f, 0.12f, 0.0f);
|
glScalef(0.12f, 0.12f, 0.0f);
|
||||||
glTranslatef(2.56f, 0.0f, 0.0f);
|
glTranslatef(2.56f, 0.0f, 0.0f);
|
||||||
glColor3f(0.0f, 1.0f, 0.0f);
|
glColor3f(0.0f, 1.0f, 0.0f);
|
||||||
this->circle(this->KEY_RIGHT_ARROW_ACTIVE);
|
this->circle(this->KEY_RIGHT_ARROW_ACTIVE);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glScalef(0.35f, 0.35f, 0.0f);
|
glScalef(0.35f, 0.35f, 0.0f);
|
||||||
glTranslatef(7.0f, 0.0f, 0.0f);
|
glTranslatef(7.0f, 0.0f, 0.0f);
|
||||||
glColor3f(0.0f, 1.0f, 1.0f);
|
glColor3f(0.0f, 1.0f, 1.0f);
|
||||||
this->circle(this->KEY_SPACE_ACTIVE);
|
this->circle(this->KEY_SPACE_ACTIVE);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glScalef(0.35f, 0.35f, 0.0f);
|
glScalef(0.35f, 0.35f, 0.0f);
|
||||||
glTranslatef(10.0f, 0.0f, 0.0f);
|
glTranslatef(10.0f, 0.0f, 0.0f);
|
||||||
glColor3f(1.0f, 1.0f, 0.0f);
|
glColor3f(1.0f, 1.0f, 0.0f);
|
||||||
this->circle(this->KEY_RETURN_ACTIVE);
|
this->circle(this->KEY_RETURN_ACTIVE);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
@ -325,27 +348,25 @@ void Game::circle()
|
|||||||
}
|
}
|
||||||
void Game::circle(bool filled)
|
void Game::circle(bool filled)
|
||||||
{
|
{
|
||||||
//glBegin(GL_LINE_LOOP);
|
//glBegin(GL_LINE_LOOP);
|
||||||
// for (int i = 0; i <= 300; i++)
|
// for (int i = 0; i <= 300; i++)
|
||||||
// {
|
// {
|
||||||
// double angle = 2 * PI * i / 300;
|
// double angle = 2 * PI * i / 300;
|
||||||
// double x = cos(angle);
|
// double x = cos(angle);
|
||||||
// double y = sin(angle);
|
// double y = sin(angle);
|
||||||
// glVertex2d(x, y);
|
// glVertex2d(x, y);
|
||||||
// }
|
// }
|
||||||
// glEnd();
|
// glEnd();
|
||||||
|
|
||||||
double radius = 1;
|
double radius = 1;
|
||||||
|
|
||||||
if (filled)
|
if (filled)
|
||||||
|
|
||||||
glBegin(GL_POLYGON);
|
glBegin(GL_POLYGON);
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
else
|
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
|
|
||||||
double angle1 = 0.0;
|
double angle1 = 0.0;
|
||||||
glVertex2d(radius * cos(0.0), radius * sin(0.0));
|
glVertex2d(radius * cos(0.0), radius * sin(0.0));
|
||||||
static const int circle_points = 100;
|
static const int circle_points = 100;
|
||||||
@ -368,8 +389,8 @@ void Game::pentagon(bool filled)
|
|||||||
glColor3f(1.0f, 0.0f, 1.0f);
|
glColor3f(1.0f, 0.0f, 1.0f);
|
||||||
float angleIncrement = 360.0f / 5.0f;
|
float angleIncrement = 360.0f / 5.0f;
|
||||||
angleIncrement *= PI / 180.0f;
|
angleIncrement *= PI / 180.0f;
|
||||||
if ( filled)
|
if (filled)
|
||||||
glBegin(GL_TRIANGLE_FAN);
|
glBegin(GL_TRIANGLE_FAN);
|
||||||
else
|
else
|
||||||
glBegin(GL_LINE_LOOP);
|
glBegin(GL_LINE_LOOP);
|
||||||
float angle = 0.0f;
|
float angle = 0.0f;
|
||||||
@ -408,6 +429,16 @@ void Game::user_screen()
|
|||||||
|
|
||||||
this->pentagon();
|
this->pentagon();
|
||||||
break;
|
break;
|
||||||
|
case UNKOWN:
|
||||||
|
float gray = 105.0 / 255.0;
|
||||||
|
glColor3f(gray, gray, gray);
|
||||||
|
glPushMatrix();
|
||||||
|
glRotatef(-45.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
glScalef(2.0f, 2.0f, 0.0f);
|
||||||
|
|
||||||
|
this->cross(true);
|
||||||
|
glPopMatrix();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// glTranslatef(3.0f, 0.0f, 0.0f); // Move Right 3 Units
|
// glTranslatef(3.0f, 0.0f, 0.0f); // Move Right 3 Units
|
||||||
@ -443,17 +474,16 @@ void Game::guest_screen()
|
|||||||
break;
|
break;
|
||||||
case UNKOWN:
|
case UNKOWN:
|
||||||
float gray = 105.0 / 255.0;
|
float gray = 105.0 / 255.0;
|
||||||
glColor3f(gray,gray,gray);
|
glColor3f(gray, gray, gray);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glRotatef(-45.0f, 0.0f, 0.0f, 1.0f);
|
glRotatef(-45.0f, 0.0f, 0.0f, 1.0f);
|
||||||
glScalef(2.0f, 2.0f, 0.0f);
|
glScalef(2.0f, 2.0f, 0.0f);
|
||||||
|
|
||||||
this->cross(true);
|
this->cross(true);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
void Game::top_screen()
|
void Game::top_screen()
|
||||||
@ -486,7 +516,6 @@ void Game::resize(int width, int height)
|
|||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
|
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
}
|
}
|
||||||
@ -533,31 +562,35 @@ void Game::key_down(SDL_Keycode key_code)
|
|||||||
break;
|
break;
|
||||||
case SDLK_SPACE:
|
case SDLK_SPACE:
|
||||||
this->KEY_SPACE_ACTIVE = true;
|
this->KEY_SPACE_ACTIVE = true;
|
||||||
|
this->on_key_space();
|
||||||
break;
|
break;
|
||||||
case SDLK_RETURN:
|
case SDLK_RETURN:
|
||||||
this->KEY_RETURN_ACTIVE = true;
|
this->KEY_RETURN_ACTIVE = true;
|
||||||
|
this->on_key_enter();
|
||||||
break;
|
break;
|
||||||
case SDLK_F11:
|
case SDLK_F11:
|
||||||
|
|
||||||
if(FULL_SCREEN){
|
if (FULL_SCREEN)
|
||||||
|
{
|
||||||
SDL_SetWindowPosition(this->WINDOW, 100, 100);
|
SDL_SetWindowPosition(this->WINDOW, 100, 100);
|
||||||
SDL_RestoreWindow(this->WINDOW);
|
SDL_RestoreWindow(this->WINDOW);
|
||||||
//SDL_SetWindowResizable(this->WINDOW, SDL_TRUE);
|
//SDL_SetWindowResizable(this->WINDOW, SDL_TRUE);
|
||||||
//SDL_SetWindowBordered(this->WINDOW, 1);
|
//SDL_SetWindowBordered(this->WINDOW, 1);
|
||||||
SDL_SetWindowSize(this->WINDOW,SCREEN_WIDTH, SCREEN_HEIGHT);
|
SDL_SetWindowSize(this->WINDOW, SCREEN_WIDTH, SCREEN_HEIGHT);
|
||||||
//SDL_SetWindowFullscreen(this->WINDOW,SDL_WINDOW_FULLSCREEN );
|
//SDL_SetWindowFullscreen(this->WINDOW,SDL_WINDOW_FULLSCREEN );
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
SDL_SetWindowPosition(this->WINDOW, 0, 0);
|
SDL_SetWindowPosition(this->WINDOW, 0, 0);
|
||||||
//SDL_SetWindowResizable(this->WINDOW, SDL_FALSE);
|
//SDL_SetWindowResizable(this->WINDOW, SDL_FALSE);
|
||||||
//SDL_SetWindowBordered(this->WINDOW, 0);
|
//SDL_SetWindowBordered(this->WINDOW, 0);
|
||||||
SDL_SetWindowSize(this->WINDOW,MONITOR_WIDTH, MONITOR_HEIGHT);
|
SDL_SetWindowSize(this->WINDOW, MONITOR_WIDTH, MONITOR_HEIGHT);
|
||||||
//SDL_SetWindowFullscreen(this->WINDOW,0 );
|
//SDL_SetWindowFullscreen(this->WINDOW,0 );
|
||||||
}
|
}
|
||||||
this->FULL_SCREEN = !this->FULL_SCREEN;
|
this->FULL_SCREEN = !this->FULL_SCREEN;
|
||||||
|
|
||||||
SDL_ShowCursor(this->FULL_SCREEN);
|
SDL_ShowCursor(this->FULL_SCREEN);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
//Do nothing
|
//Do nothing
|
||||||
@ -668,14 +701,54 @@ void Game::on_key_right_arrow()
|
|||||||
}
|
}
|
||||||
void Game::on_key_space()
|
void Game::on_key_space()
|
||||||
{
|
{
|
||||||
|
this->client->send(false,this->USER_CURRENT);
|
||||||
}
|
}
|
||||||
void Game::on_key_enter()
|
void Game::on_key_enter()
|
||||||
{
|
{
|
||||||
|
this->client->send(true,this->USER_CURRENT);
|
||||||
|
}
|
||||||
|
void Game::update(SHAPE &s, MODE &m)
|
||||||
|
{
|
||||||
|
if (m == ME || (ME==EVE && m == ALICE))
|
||||||
|
this->USER_CURRENT = s;
|
||||||
|
else
|
||||||
|
this->GUST_CURRENT = s;
|
||||||
}
|
}
|
||||||
} // namespace betacore
|
} // namespace betacore
|
||||||
|
|
||||||
|
|
||||||
|
void ussage(){
|
||||||
|
std::cout
|
||||||
|
<< "Ussage:\n"
|
||||||
|
<< "\tMODE: 1-3\n"
|
||||||
|
<< "\t\t1)Alice\n"
|
||||||
|
<< "\t\t2)Bob\n"
|
||||||
|
<< "\t\t2)Eve\n"
|
||||||
|
<< "\tport\n"
|
||||||
|
<< "\taddress"
|
||||||
|
<< std::endl;
|
||||||
|
}
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
betacore::Game game;
|
|
||||||
|
if(argc < 4){
|
||||||
|
ussage();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
betacore::MODE mode = betacore::EVE;
|
||||||
|
int a = atoi(argv[1]);
|
||||||
|
std::cout << "Running mode" << a << std::endl;
|
||||||
|
switch( a){
|
||||||
|
case 1:
|
||||||
|
mode = betacore::ALICE;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
mode = betacore::BOB;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mode = betacore::EVE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
betacore::Game game(mode, atoi(argv[2]),argv[3]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
137
source/server.cpp
Normal file
137
source/server.cpp
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
#include "../includes/server.hpp"
|
||||||
|
|
||||||
|
namespace betacore
|
||||||
|
{
|
||||||
|
Server::Server(int port)
|
||||||
|
{
|
||||||
|
this->port = port;
|
||||||
|
std::cout << "And so it begins..." << std::endl;
|
||||||
|
this->start();
|
||||||
|
}
|
||||||
|
void Server::start()
|
||||||
|
{
|
||||||
|
this->server_socket = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
if (this->server_socket < 0)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR on opening socket" << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::cout << "Socket Connected" << std::endl;
|
||||||
|
|
||||||
|
bzero((char *)&server_address, sizeof(server_address));
|
||||||
|
|
||||||
|
server_address.sin_family = AF_INET;
|
||||||
|
server_address.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
server_address.sin_port = htons(this->port);
|
||||||
|
|
||||||
|
if (bind(
|
||||||
|
server_socket,
|
||||||
|
(struct sockaddr *)&server_address,
|
||||||
|
sizeof(server_address)) < 0)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR on binding " << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::cout << "Bound" << std::endl;
|
||||||
|
online = true;
|
||||||
|
server_running = true;
|
||||||
|
std::cout << "Server is online" << std::endl;
|
||||||
|
signal(SIGPIPE, SIG_IGN); // Prevents issue with sig kill on client
|
||||||
|
std::thread listen_thread([this] { this->listener(); });
|
||||||
|
listen_thread.detach();
|
||||||
|
}
|
||||||
|
void Server::listener()
|
||||||
|
{
|
||||||
|
std::cout << "Listener " << online << std::endl;
|
||||||
|
struct sockaddr_in client_address;
|
||||||
|
listen(this->server_socket, 10);
|
||||||
|
while (online)
|
||||||
|
{
|
||||||
|
|
||||||
|
socklen_t client_socket_length = sizeof(client_address);
|
||||||
|
int client_number =
|
||||||
|
accept(server_socket, (struct sockaddr *)&client_address, &client_socket_length);
|
||||||
|
this->clients.push_back(client_number);
|
||||||
|
std::cout << "New Conenction" << std::endl;
|
||||||
|
if (client_number < 0)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR on accept" << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
std::thread socket_thread([this, client_number] { this->read_socket(client_number); });
|
||||||
|
socket_thread.detach();
|
||||||
|
}
|
||||||
|
this->shutdown();
|
||||||
|
}
|
||||||
|
void Server::read_socket(int client)
|
||||||
|
{
|
||||||
|
std::cout
|
||||||
|
<< "Ready To Read "
|
||||||
|
<< client
|
||||||
|
<< std::endl;
|
||||||
|
int n;
|
||||||
|
char buffer[BUFFER_LENGTH];
|
||||||
|
while (online &&
|
||||||
|
std::find(clients.begin(), clients.end(), client) != clients.end())
|
||||||
|
{
|
||||||
|
|
||||||
|
bzero(buffer, BUFFER_LENGTH);
|
||||||
|
|
||||||
|
n = read(client, buffer, BUFFER_LENGTH - 1);
|
||||||
|
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR reading from socket" << std::endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
this->forward_message(client, buffer);
|
||||||
|
}
|
||||||
|
std::cout << "Closing Connection for " << client << std::endl;
|
||||||
|
clients.erase(
|
||||||
|
std::remove(clients.begin(), clients.end(), client), clients.end());
|
||||||
|
close(client);
|
||||||
|
}
|
||||||
|
void Server::forward_message(int client, char buffer[BUFFER_LENGTH])
|
||||||
|
{
|
||||||
|
std::cout << "forward message form " << client << std::endl;
|
||||||
|
int n;
|
||||||
|
int error = 0;
|
||||||
|
|
||||||
|
for (int c : clients)
|
||||||
|
{
|
||||||
|
if (c == client)
|
||||||
|
continue;
|
||||||
|
std::cout
|
||||||
|
<< "forward message form "
|
||||||
|
<< client
|
||||||
|
<< "to "
|
||||||
|
<< c
|
||||||
|
<< std::endl;
|
||||||
|
n = write(c, buffer, strlen(buffer));
|
||||||
|
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
std::cout << "ERROR Writing socket to " << c << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Server::shutdown()
|
||||||
|
{
|
||||||
|
std::cout << "Server is shuting down" << std::endl;
|
||||||
|
|
||||||
|
std::cout << "Closing server socket" << std::endl;
|
||||||
|
close(this->server_socket);
|
||||||
|
server_running = false;
|
||||||
|
}
|
||||||
|
void Server::off()
|
||||||
|
{
|
||||||
|
this->online = false;
|
||||||
|
}
|
||||||
|
bool Server::running()
|
||||||
|
{
|
||||||
|
return this->server_running;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace betacore
|
8
source/server_driver.cpp
Normal file
8
source/server_driver.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include "server.hpp"
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]){
|
||||||
|
betacore::Server s(4444);
|
||||||
|
//s.off();
|
||||||
|
while(s.running()){}
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user