From d933eae3389b6441218680d3f0910247ea62b3fc Mon Sep 17 00:00:00 2001 From: hilnius Date: Sun, 16 Jun 2013 23:54:02 +0000 Subject: [PATCH] base commit git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/hilnius@12865 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- dev/SocketsBase/SocketsBase.cbp | 68 ++++++++++ dev/SocketsBase/SocketsBase.depend | 124 ++++++++++++++++++ dev/SocketsBase/SocketsBase.layout | 84 ++++++++++++ dev/SocketsBase/bin/Debug/SocketsBase | Bin 0 -> 253053 bytes dev/SocketsBase/client_network_manager.cpp | 42 ++++++ dev/SocketsBase/client_network_manager.hpp | 23 ++++ dev/SocketsBase/http_functions.cpp | 47 +++++++ dev/SocketsBase/http_functions.hpp | 17 +++ dev/SocketsBase/main.cpp | 60 +++++++++ dev/SocketsBase/network_manager.cpp | 43 ++++++ dev/SocketsBase/network_manager.hpp | 31 +++++ dev/SocketsBase/packet.cpp | 9 ++ dev/SocketsBase/packet.hpp | 23 ++++ dev/SocketsBase/protocol.cpp | 14 ++ dev/SocketsBase/protocol.hpp | 31 +++++ dev/SocketsBase/protocol_listener.cpp | 9 ++ dev/SocketsBase/protocol_listener.hpp | 26 ++++ dev/SocketsBase/protocol_manager.cpp | 51 +++++++ dev/SocketsBase/protocol_manager.hpp | 22 ++++ .../protocols/get_public_address.cpp | 121 +++++++++++++++++ .../protocols/get_public_address.hpp | 30 +++++ dev/SocketsBase/server_network_manager.cpp | 43 ++++++ dev/SocketsBase/server_network_manager.hpp | 23 ++++ dev/SocketsBase/singleton.hpp | 43 ++++++ dev/SocketsBase/stk_host.cpp | 108 +++++++++++++++ dev/SocketsBase/stk_host.hpp | 37 ++++++ dev/SocketsBase/stk_peer.cpp | 33 +++++ dev/SocketsBase/stk_peer.hpp | 22 ++++ 28 files changed, 1184 insertions(+) create mode 100644 dev/SocketsBase/SocketsBase.cbp create mode 100644 dev/SocketsBase/SocketsBase.depend create mode 100644 dev/SocketsBase/SocketsBase.layout create mode 100755 dev/SocketsBase/bin/Debug/SocketsBase create mode 100644 dev/SocketsBase/client_network_manager.cpp create mode 100644 dev/SocketsBase/client_network_manager.hpp create mode 100644 dev/SocketsBase/http_functions.cpp create mode 100644 dev/SocketsBase/http_functions.hpp create mode 100644 dev/SocketsBase/main.cpp create mode 100644 dev/SocketsBase/network_manager.cpp create mode 100644 dev/SocketsBase/network_manager.hpp create mode 100644 dev/SocketsBase/packet.cpp create mode 100644 dev/SocketsBase/packet.hpp create mode 100644 dev/SocketsBase/protocol.cpp create mode 100644 dev/SocketsBase/protocol.hpp create mode 100644 dev/SocketsBase/protocol_listener.cpp create mode 100644 dev/SocketsBase/protocol_listener.hpp create mode 100644 dev/SocketsBase/protocol_manager.cpp create mode 100644 dev/SocketsBase/protocol_manager.hpp create mode 100644 dev/SocketsBase/protocols/get_public_address.cpp create mode 100644 dev/SocketsBase/protocols/get_public_address.hpp create mode 100644 dev/SocketsBase/server_network_manager.cpp create mode 100644 dev/SocketsBase/server_network_manager.hpp create mode 100644 dev/SocketsBase/singleton.hpp create mode 100644 dev/SocketsBase/stk_host.cpp create mode 100644 dev/SocketsBase/stk_host.hpp create mode 100644 dev/SocketsBase/stk_peer.cpp create mode 100644 dev/SocketsBase/stk_peer.hpp diff --git a/dev/SocketsBase/SocketsBase.cbp b/dev/SocketsBase/SocketsBase.cbp new file mode 100644 index 000000000..447eb8846 --- /dev/null +++ b/dev/SocketsBase/SocketsBase.cbp @@ -0,0 +1,68 @@ + + + + + + diff --git a/dev/SocketsBase/SocketsBase.depend b/dev/SocketsBase/SocketsBase.depend new file mode 100644 index 000000000..999a4cea1 --- /dev/null +++ b/dev/SocketsBase/SocketsBase.depend @@ -0,0 +1,124 @@ +# depslib dependency file v1.0 +1371430952 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/main.cpp + + + "client_network_manager.hpp" + "server_network_manager.hpp" + "protocol_manager.hpp" + "protocols/get_public_address.hpp" + + + +1371308465 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/client.cpp + "client.hpp" + + +1371308471 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/client.hpp + "stk_peer.h" + + +1371308808 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/stk_peer.h + +1371342078 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/client_network_manager.cpp + "client_network_manager.hpp" + + +1371312921 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/client_network_manager.hpp + "network_manager.hpp" + +1371431127 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/network_manager.hpp + "stk_peer.hpp" + "stk_host.hpp" + + "protocol_listener.hpp" + +1370655017 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/server.hpp + "stk_peer.h" + + +1371431262 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/network_manager.cpp + "network_manager.hpp" + + +1370655140 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/server.cpp + "server.hpp" + + +1371340734 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/server_network_manager.cpp + "server_network_manager.hpp" + + + + + +1371340658 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/server_network_manager.hpp + "network_manager.hpp" + +1371345329 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/stk_peer.cpp + "stk_peer.hpp" + + + +1371342227 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/stk_peer.hpp + "stk_host.hpp" + + +1371431149 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/stk_host.hpp + + +1371430709 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/stk_host.cpp + "stk_host.hpp" + "network_manager.hpp" + + + + +1371429449 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/protocol_listener.hpp + + + +1371344039 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/http_functions.cpp + "http_functions.hpp" + + + + +1371343994 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/http_functions.hpp + + +1371428907 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/protocol_manager.hpp + "protocol_listener.hpp" + +1371346908 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/packet.cpp + "packet.hpp" + +1371427096 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/packet.hpp + + + +1371429400 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/protocol.cpp + "protocol.hpp" + +1371429637 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/protocol.hpp + "protocol_listener.hpp" + + +1371342576 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/protocol_listener.cpp + "protocol_listener.hpp" + +1371429738 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/protocol_manager.cpp + "protocol_manager.hpp" + "protocol.hpp" + + +1371431357 source:/home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/protocols/get_public_address.cpp + "get_public_address.hpp" + "../network_manager.hpp" + + + + + +1371427140 /home/hilnius/Development/svn/supertuxkart/main/branches/hilnius/dev/SocketsBase/protocols/get_public_address.hpp + "../protocol.hpp" + diff --git a/dev/SocketsBase/SocketsBase.layout b/dev/SocketsBase/SocketsBase.layout new file mode 100644 index 000000000..c1fcf01c9 --- /dev/null +++ b/dev/SocketsBase/SocketsBase.layout @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/SocketsBase/bin/Debug/SocketsBase b/dev/SocketsBase/bin/Debug/SocketsBase new file mode 100755 index 0000000000000000000000000000000000000000..b2d1779f7251b765c680fdfca209af251bba28e2 GIT binary patch literal 253053 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 + +ClientNetworkManager::ClientNetworkManager() +{ +} + +ClientNetworkManager::~ClientNetworkManager() +{ +} + +void ClientNetworkManager::run() +{ + if (enet_initialize() != 0) + { + printf("Could not initialize enet.\n"); + return; + } +} + +void ClientNetworkManager::connect(uint32_t ip, uint16_t port) +{ + m_localhost = new STKHost(); + m_localhost->setupClient(1, 2, 0, 0); + m_localhost->startListening(); + + STKPeer* peer = new STKPeer(); + peer->connectToServer(m_localhost, ip, port, 2, 0); + + m_peers.push_back(peer); +} + +void ClientNetworkManager::packetReceived(char* data) +{ + printf("ClientNetworkManager::packetReceived()\n"); + puts(data); +} +void ClientNetworkManager::sendPacket(char* data) +{ + m_peers[0]->sendPacket(data); +} diff --git a/dev/SocketsBase/client_network_manager.hpp b/dev/SocketsBase/client_network_manager.hpp new file mode 100644 index 000000000..cdbe73cb8 --- /dev/null +++ b/dev/SocketsBase/client_network_manager.hpp @@ -0,0 +1,23 @@ +#ifndef CLIENT_NETWORK_MANAGER_HPP +#define CLIENT_NETWORK_MANAGER_HPP + +#include "network_manager.hpp" + + +class ClientNetworkManager : public NetworkManager +{ + public: + ClientNetworkManager(); + virtual ~ClientNetworkManager(); + + virtual void run(); + + void connect(uint32_t ip, uint16_t port); + + virtual void packetReceived(char* data); + virtual void sendPacket(char* data); + protected: + private: +}; + +#endif // CLIENT_NETWORK_MANAGER_HPP diff --git a/dev/SocketsBase/http_functions.cpp b/dev/SocketsBase/http_functions.cpp new file mode 100644 index 000000000..b8246c59b --- /dev/null +++ b/dev/SocketsBase/http_functions.cpp @@ -0,0 +1,47 @@ +#include "http_functions.hpp" + + +#include +#include +#include + +namespace HTTP +{ +CURL *curl; +CURLcode res; + +static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + ((std::string*)userp)->append((char*)contents, size * nmemb); + return size * nmemb; +} + +void init() +{ + curl_global_init(CURL_GLOBAL_DEFAULT); + curl = curl_easy_init(); + if(!curl) + printf("Error while loading cURL library.\n"); +} + +std::string getPage(std::string url) +{ + std::string readBuffer = ""; + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); + res = curl_easy_perform(curl); + if(res != CURLE_OK) + fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); + + readBuffer.erase(readBuffer.begin()+64, readBuffer.end()); + return readBuffer; +} + +void shutdown() +{ + curl_easy_cleanup(curl); + curl_global_cleanup(); +} + +} diff --git a/dev/SocketsBase/http_functions.hpp b/dev/SocketsBase/http_functions.hpp new file mode 100644 index 000000000..927725c40 --- /dev/null +++ b/dev/SocketsBase/http_functions.hpp @@ -0,0 +1,17 @@ +#ifndef HTTP_FUNCTIONS_HPP +#define HTTP_FUNCTIONS_HPP + +#include + +namespace HTTP +{ + +void init(); +void shutdown(); + +std::string getPage(std::string url); + + +} + +#endif // HTTP_FUNCTIONS_HPP diff --git a/dev/SocketsBase/main.cpp b/dev/SocketsBase/main.cpp new file mode 100644 index 000000000..763b2cc14 --- /dev/null +++ b/dev/SocketsBase/main.cpp @@ -0,0 +1,60 @@ +#include +#include + +#include "client_network_manager.hpp" +#include "server_network_manager.hpp" +#include "protocol_manager.hpp" +#include "protocols/get_public_address.hpp" +#include +#include + +using namespace std; +ProtocolManager* protocolListener; + +void* foo(void* data) +{ + while(1) + { + protocolListener->update(); + } + return NULL; +} + +int main() +{ + std::string answer; + cout << "host or client:"; + cin >> answer; + if (answer == "client") + { + ClientNetworkManager clt; + clt.run(); + clt.connect(0x0100007f, 7000); // addr in little endian, real address is 7f 00 00 01 (127.0.0.1) + + protocolListener = new ProtocolManager(); + + pthread_t* thrd = (pthread_t*)(malloc(sizeof(pthread_t))); + pthread_create(thrd, NULL, foo, NULL); + + // start a retreive stun addr protocol + Protocol* prt = new GetPublicAddress(); + protocolListener->runProtocol(prt); + + char buffer[256]; + while (1) + { + gets(buffer); + if (strlen(buffer) == 0) { continue; } + clt.sendPacket(buffer); + } + } + else if (answer == "host") + { + ServerNetworkManager srv; + srv.run(); + srv.start(); + //srv.protocolListener = new ProtocolManager(); + while(1){} + } + return 0; +} diff --git a/dev/SocketsBase/network_manager.cpp b/dev/SocketsBase/network_manager.cpp new file mode 100644 index 000000000..e9f76dae6 --- /dev/null +++ b/dev/SocketsBase/network_manager.cpp @@ -0,0 +1,43 @@ +#include "network_manager.hpp" + +#include + +NetworkManager* NetworkManager::instance = NULL; + +NetworkManager::NetworkManager() +{ + if (NetworkManager::instance) + { + printf("Warning : a Newtork Manager is being deleted.\n"); + delete NetworkManager::instance; + } + NetworkManager::instance = this; + printf("New Network Manager created.\n"); +} + +NetworkManager::~NetworkManager() +{ +} + +void NetworkManager::run() +{ +} + + +void NetworkManager::sendRawPacket(uint8_t* data, int length, unsigned int dstIp, unsigned short dstPort) +{ + instance->getHost()->sendRawPacket(data, length, dstIp, dstPort); +} +uint8_t* NetworkManager::receiveRawPacket() +{ + return instance->getHost()->receiveRawPacket(); +} +void NetworkManager::receptionCallback(char* data) +{ + instance->packetReceived(data); +} + +STKHost* NetworkManager::getHost() +{ + return m_localhost; +} diff --git a/dev/SocketsBase/network_manager.hpp b/dev/SocketsBase/network_manager.hpp new file mode 100644 index 000000000..c6b280235 --- /dev/null +++ b/dev/SocketsBase/network_manager.hpp @@ -0,0 +1,31 @@ +#ifndef NETWORKMANAGER_HPP +#define NETWORKMANAGER_HPP + +#include "stk_peer.hpp" +#include "stk_host.hpp" +#include + +#include "protocol_listener.hpp" + +class NetworkManager +{ + public: + NetworkManager(); + virtual ~NetworkManager(); + + virtual void run() = 0; + + static void sendRawPacket(uint8_t* data, int length, unsigned int dstIp, unsigned short dstPort); + static uint8_t* receiveRawPacket(); + static void receptionCallback(char* data); + virtual void packetReceived(char* data) = 0; + + STKHost* getHost(); + protected: + std::vector m_peers; + STKHost* m_localhost; + + static NetworkManager* instance; +}; + +#endif // NETWORKMANAGER_HPP diff --git a/dev/SocketsBase/packet.cpp b/dev/SocketsBase/packet.cpp new file mode 100644 index 000000000..6ab1d723c --- /dev/null +++ b/dev/SocketsBase/packet.cpp @@ -0,0 +1,9 @@ +#include "packet.hpp" + +Packet::Packet() +{ +} + +Packet::~Packet() +{ +} diff --git a/dev/SocketsBase/packet.hpp b/dev/SocketsBase/packet.hpp new file mode 100644 index 000000000..5e7f14717 --- /dev/null +++ b/dev/SocketsBase/packet.hpp @@ -0,0 +1,23 @@ +#ifndef PACKET_HPP +#define PACKET_HPP + +#include +#include + +class Packet +{ + public: + Packet(); + virtual ~Packet(); + + virtual std::string getData(); + + protected: + char* m_packetHeader; + unsigned int m_packetHeaderSize; + unsigned int m_packetSize; + Packet* m_parent; + std::vector m_children; +}; + +#endif // PACKET_HPP diff --git a/dev/SocketsBase/protocol.cpp b/dev/SocketsBase/protocol.cpp new file mode 100644 index 000000000..27635e639 --- /dev/null +++ b/dev/SocketsBase/protocol.cpp @@ -0,0 +1,14 @@ +#include "protocol.hpp" + +Protocol::Protocol() +{ +} + +Protocol::~Protocol() +{ +} + +PROTOCOL_TYPE Protocol::getProtocolType() +{ + return m_type; +} diff --git a/dev/SocketsBase/protocol.hpp b/dev/SocketsBase/protocol.hpp new file mode 100644 index 000000000..189266d8c --- /dev/null +++ b/dev/SocketsBase/protocol.hpp @@ -0,0 +1,31 @@ +#ifndef PROTOCOL_HPP +#define PROTOCOL_HPP + +#include "protocol_listener.hpp" + +#include + +enum PROTOCOL_TYPE +{ + GET_PUBLIC_ADDRESS = 0 +}; + +class Protocol +{ + public: + Protocol(); + virtual ~Protocol(); + + virtual void messageReceived(uint8_t* data) = 0; + + virtual void setup() = 0; + virtual void start() = 0; + virtual void update() = 0; + + PROTOCOL_TYPE getProtocolType(); + protected: + ProtocolListener* m_listener; + PROTOCOL_TYPE m_type; +}; + +#endif // PROTOCOL_HPP diff --git a/dev/SocketsBase/protocol_listener.cpp b/dev/SocketsBase/protocol_listener.cpp new file mode 100644 index 000000000..f05e7b08f --- /dev/null +++ b/dev/SocketsBase/protocol_listener.cpp @@ -0,0 +1,9 @@ +#include "protocol_listener.hpp" + +ProtocolListener::ProtocolListener() +{ +} + +ProtocolListener::~ProtocolListener() +{ +} diff --git a/dev/SocketsBase/protocol_listener.hpp b/dev/SocketsBase/protocol_listener.hpp new file mode 100644 index 000000000..ec843d890 --- /dev/null +++ b/dev/SocketsBase/protocol_listener.hpp @@ -0,0 +1,26 @@ +#ifndef PROTOCOL_LISTENER_HPP +#define PROTOCOL_LISTENER_HPP + +#include +#include + +class Protocol; + +class ProtocolListener +{ + public: + ProtocolListener(); + virtual ~ProtocolListener(); + + virtual void messageReceived(uint8_t* data) = 0; + + virtual void runProtocol(Protocol* protocol) = 0; + virtual void stopProtocol(Protocol* protocol) = 0; + + virtual void update() = 0; + + protected: + std::vector m_protocols; +}; + +#endif // PROTOCOL_LISTENER_HPP diff --git a/dev/SocketsBase/protocol_manager.cpp b/dev/SocketsBase/protocol_manager.cpp new file mode 100644 index 000000000..64c2eff3b --- /dev/null +++ b/dev/SocketsBase/protocol_manager.cpp @@ -0,0 +1,51 @@ +#include "protocol_manager.hpp" + +#include "protocol.hpp" +#include + +ProtocolManager::ProtocolManager() : ProtocolListener() +{ +} + +ProtocolManager::~ProtocolManager() +{ +} + +void ProtocolManager::messageReceived(uint8_t* data) +{ + assert(data); + m_messagesToProcess.push_back(data); +} + +void ProtocolManager::runProtocol(Protocol* protocol) +{ + m_protocols.push_back(protocol); + protocol->setup(); + protocol->start(); +} +void ProtocolManager::stopProtocol(Protocol* protocol) +{ + +} + +void ProtocolManager::update() +{ + // before updating, notice protocols that they have received information + int size = m_messagesToProcess.size(); + for (int i = 0; i < size; i++) + { + uint8_t* data = m_messagesToProcess.back(); + PROTOCOL_TYPE searchedProtocol = (PROTOCOL_TYPE)(data[0]); + for (unsigned int i = 0; i < m_protocols.size() ; i++) + { + if (m_protocols[i]->getProtocolType() == searchedProtocol) + m_protocols[i]->messageReceived(data+1); + } + m_messagesToProcess.pop_back(); + } + // now update all protocols + for (unsigned int i = 0; i < m_protocols.size(); i++) + { + m_protocols[i]->update(); + } +} diff --git a/dev/SocketsBase/protocol_manager.hpp b/dev/SocketsBase/protocol_manager.hpp new file mode 100644 index 000000000..586766a4c --- /dev/null +++ b/dev/SocketsBase/protocol_manager.hpp @@ -0,0 +1,22 @@ +#ifndef PROTOCOL_MANAGER_HPP +#define PROTOCOL_MANAGER_HPP + +#include "protocol_listener.hpp" + +class ProtocolManager : public ProtocolListener +{ + public: + ProtocolManager(); + virtual ~ProtocolManager(); + + virtual void messageReceived(uint8_t* data); + + virtual void runProtocol(Protocol* protocol); + virtual void stopProtocol(Protocol* protocol); + + virtual void update(); + protected: + std::vector m_messagesToProcess; +}; + +#endif // PROTOCOL_MANAGER_HPP diff --git a/dev/SocketsBase/protocols/get_public_address.cpp b/dev/SocketsBase/protocols/get_public_address.cpp new file mode 100644 index 000000000..3e7c93786 --- /dev/null +++ b/dev/SocketsBase/protocols/get_public_address.cpp @@ -0,0 +1,121 @@ +#include "get_public_address.hpp" + +#include "../network_manager.hpp" + +#include +#include +#include +#include + +int stunRand() +{ + static bool init = false; + if (!init) + { + srand(time(NULL)); + init = true; + } + return rand(); +} + +GetPublicAddress::GetPublicAddress() : Protocol() +{ + m_type = GET_PUBLIC_ADDRESS; +} + +GetPublicAddress::~GetPublicAddress() +{ +} + +void GetPublicAddress::messageReceived(uint8_t* data) +{ + assert(data); + if (m_state == TEST_SENT && sizeof(data) >= 20) + { + + m_state = ADDRESS_KNOWN; + } +} + +void GetPublicAddress::setup() +{ + m_state = NOTHING_DONE; +} + +void GetPublicAddress::start() +{ +} + +void GetPublicAddress::update() +{ + if (m_state == NOTHING_DONE) + { + // format : 00MMMMMCMMMCMMMM (cf rfc 5389) + uint16_t message_type = 0b0000000000000001; // binding request + m_stunTransactionID[0] = stunRand(); + m_stunTransactionID[1] = stunRand(); + m_stunTransactionID[2] = stunRand(); + uint16_t message_length = 0x0000; + + uint8_t bytes[21]; // the message to be sent + // bytes 0-1 : the type of the message, + bytes[0] = (uint8_t)(message_type>>8); + bytes[1] = (uint8_t)(message_type); + + // bytes 2-3 : message length added to header (attributes) + bytes[2] = (uint8_t)(message_length>>8); + bytes[3] = (uint8_t)(message_length); + + // bytes 4-7 : magic cookie to recognize the stun protocol + bytes[4] = (uint8_t)(m_stunMagicCookie>>24); + bytes[5] = (uint8_t)(m_stunMagicCookie>>16); + bytes[6] = (uint8_t)(m_stunMagicCookie>>8); + bytes[7] = (uint8_t)(m_stunMagicCookie); + + // bytes 8-19 : the transaction id + bytes[8] = (uint8_t)(m_stunTransactionID[0]>>24); + bytes[9] = (uint8_t)(m_stunTransactionID[0]>>16); + bytes[10] = (uint8_t)(m_stunTransactionID[0]>>8); + bytes[11] = (uint8_t)(m_stunTransactionID[0]); + bytes[12] = (uint8_t)(m_stunTransactionID[1]>>24); + bytes[13] = (uint8_t)(m_stunTransactionID[1]>>16); + bytes[14] = (uint8_t)(m_stunTransactionID[1]>>8); + bytes[15] = (uint8_t)(m_stunTransactionID[1]); + bytes[16] = (uint8_t)(m_stunTransactionID[2]>>24); + bytes[17] = (uint8_t)(m_stunTransactionID[2]>>16); + bytes[18] = (uint8_t)(m_stunTransactionID[2]>>8); + bytes[19] = (uint8_t)(m_stunTransactionID[2]); + bytes[20] = '\0'; + + unsigned int dst = 132*256*256*256+177*256*256+123*256+6; + NetworkManager::sendRawPacket(bytes, 20, dst, 3478); + m_state = TEST_SENT; + + uint8_t* data = NetworkManager::receiveRawPacket(); + assert(data); + // check that the stun response is a response, contains the magic cookie and the transaction ID + if ( data[0] == 0b01 && + data[1] == 0b01 && + data[4] == (uint8_t)(m_stunMagicCookie>>24) && + data[5] == (uint8_t)(m_stunMagicCookie>>16) && + data[6] == (uint8_t)(m_stunMagicCookie>>8) && + data[7] == (uint8_t)(m_stunMagicCookie) && + data[8] == (uint8_t)(m_stunTransactionID[0]>>24) && + data[9] == (uint8_t)(m_stunTransactionID[0]>>16) && + data[10] == (uint8_t)(m_stunTransactionID[0]>>8 ) && + data[11] == (uint8_t)(m_stunTransactionID[0] ) && + data[12] == (uint8_t)(m_stunTransactionID[1]>>24) && + data[13] == (uint8_t)(m_stunTransactionID[1]>>16) && + data[14] == (uint8_t)(m_stunTransactionID[1]>>8 ) && + data[15] == (uint8_t)(m_stunTransactionID[1] ) && + data[16] == (uint8_t)(m_stunTransactionID[2]>>24) && + data[17] == (uint8_t)(m_stunTransactionID[2]>>16) && + data[18] == (uint8_t)(m_stunTransactionID[2]>>8 ) && + data[19] == (uint8_t)(m_stunTransactionID[2] )) + { + printf("the stun server reponded a valid answer\n"); + int messageSize = data[2]*256+data[3]; + printf("the answer is %i bytes long\n", messageSize); + } + } +} diff --git a/dev/SocketsBase/protocols/get_public_address.hpp b/dev/SocketsBase/protocols/get_public_address.hpp new file mode 100644 index 000000000..da97d7887 --- /dev/null +++ b/dev/SocketsBase/protocols/get_public_address.hpp @@ -0,0 +1,30 @@ +#ifndef GET_PUBLIC_ADDRESS_HPP +#define GET_PUBLIC_ADDRESS_HPP + +#include "../protocol.hpp" + +class GetPublicAddress : public Protocol +{ + public: + GetPublicAddress(); + virtual ~GetPublicAddress(); + + virtual void messageReceived(uint8_t* data); + + virtual void setup(); + virtual void start(); + virtual void update(); + + protected: + enum STATE + { + NOTHING_DONE, + TEST_SENT, + ADDRESS_KNOWN + }; + STATE m_state; + uint32_t m_stunTransactionID[3]; + const uint32_t m_stunMagicCookie = 0x2112A442; +}; + +#endif // GET_PUBLIC_ADDRESS_HPP diff --git a/dev/SocketsBase/server_network_manager.cpp b/dev/SocketsBase/server_network_manager.cpp new file mode 100644 index 000000000..939b1d465 --- /dev/null +++ b/dev/SocketsBase/server_network_manager.cpp @@ -0,0 +1,43 @@ +#include "server_network_manager.hpp" + +#include +#include +#include +#include + +ServerNetworkManager::ServerNetworkManager() +{ + m_localhost = NULL; +} + +ServerNetworkManager::~ServerNetworkManager() +{ +} + +void ServerNetworkManager::run() +{ + if (enet_initialize() != 0) + { + printf("Could not initialize enet.\n"); + return; + } +} + +void ServerNetworkManager::start() +{ + m_localhost = new STKHost(); + m_localhost->setupServer(STKHost::HOST_ANY, 7000, 32, 2, 0, 0); + m_localhost->startListening(); + printf("Server now setup.\n"); +} + +void ServerNetworkManager::packetReceived(char* data) +{ + printf("ServerNetworkManager::packetReceived()\n"); + puts(data); + sendPacket(data); +} +void ServerNetworkManager::sendPacket(char* data) +{ + m_localhost->broadcastPacket(data); +} diff --git a/dev/SocketsBase/server_network_manager.hpp b/dev/SocketsBase/server_network_manager.hpp new file mode 100644 index 000000000..f4b33c533 --- /dev/null +++ b/dev/SocketsBase/server_network_manager.hpp @@ -0,0 +1,23 @@ +#ifndef SERVER_NETWORK_MANAGER_HPP +#define SERVER_NETWORK_MANAGER_HPP + +#include "network_manager.hpp" + + +class ServerNetworkManager : public NetworkManager +{ + public: + ServerNetworkManager(); + virtual ~ServerNetworkManager(); + + virtual void run(); + + void start(); + + virtual void packetReceived(char* data); + virtual void sendPacket(char* data); + protected: + +}; + +#endif // SERVER_NETWORK_MANAGER_HPP diff --git a/dev/SocketsBase/singleton.hpp b/dev/SocketsBase/singleton.hpp new file mode 100644 index 000000000..61c7ce121 --- /dev/null +++ b/dev/SocketsBase/singleton.hpp @@ -0,0 +1,43 @@ +#ifndef SINGLETON_HPP +#define SINGLETON_HPP + +#include + +template +class Singleton +{ + protected: + Singleton () { } + ~Singleton () { std::cout << "destroying singleton." << std::endl; } + + public: + static T *getInstance () + { + if (NULL == m_singleton) + { + std::cout << "creating singleton." << std::endl; + m_singleton = new T; + } + else + { + std::cout << "singleton already created!" << std::endl; + } + return (static_cast (m_singleton)); + } + + static void kill () + { + if (NULL != m_singleton) + { + delete m_singleton; + m_singleton = NULL; + } + } + + private: + static T *m_singleton; +}; + +template T *Singleton::_singleton = NULL; + +#endif // SINGLETON_HPP diff --git a/dev/SocketsBase/stk_host.cpp b/dev/SocketsBase/stk_host.cpp new file mode 100644 index 000000000..8ef7fcd01 --- /dev/null +++ b/dev/SocketsBase/stk_host.cpp @@ -0,0 +1,108 @@ +#include "stk_host.hpp" + +#include "network_manager.hpp" + +#include +#include +#include + +void* STKHost::receive_data(void* self) +{ + ENetEvent event; + ENetHost* host = (((STKHost*)(self))->m_host); + while (1) + { + while (enet_host_service(host, &event, 0) != 0) { + printf("message received\n"); + switch (event.type) { + case ENET_EVENT_TYPE_RECEIVE: + NetworkManager::receptionCallback((char*) event.packet->data); + break; + case ENET_EVENT_TYPE_DISCONNECT: + printf("Somebody is now disconnected.\n"); + case ENET_EVENT_TYPE_CONNECT: + printf("A client has just connected.\n"); + break; + case ENET_EVENT_TYPE_NONE: + break; + } + } + } + return NULL; +} + +STKHost::STKHost() +{ + m_host = NULL; +} + +STKHost::~STKHost() +{ +} + +void STKHost::setupServer(uint32_t address, uint16_t port, int peerCount, int channelLimit, uint32_t maxIncomingBandwidth, uint32_t maxOutgoingBandwidth) +{ + ENetAddress addr; + addr.host = address; + addr.port = port; + + m_host = enet_host_create(&addr, peerCount, channelLimit, maxIncomingBandwidth, maxOutgoingBandwidth); + if (m_host == NULL) + { + fprintf (stderr, "An error occurred while trying to create an ENet server host.\n"); + exit (EXIT_FAILURE); + } + //pthread_t* thrd = (pthread_t*)(malloc(sizeof(pthread_t))); + //pthread_create(thrd, NULL, &STKHost::receive_data, this); +} + +void STKHost::setupClient(int peerCount, int channelLimit, uint32_t maxIncomingBandwidth, uint32_t maxOutgoingBandwidth) +{ + m_host = enet_host_create(NULL, peerCount, channelLimit, maxIncomingBandwidth, maxOutgoingBandwidth); + if (m_host == NULL) + { + fprintf (stderr, "An error occurred while trying to create an ENet client host.\n"); + exit (EXIT_FAILURE); + } + //pthread_t* thrd = (pthread_t*)(malloc(sizeof(pthread_t))); + //pthread_create(thrd, NULL, &STKHost::receive_data, this); +} + +void STKHost::startListening() +{ + pthread_t* thrd = (pthread_t*)(malloc(sizeof(pthread_t))); + pthread_create(thrd, NULL, &STKHost::receive_data, this); +} + +void STKHost::sendRawPacket(uint8_t* data, int length, unsigned int dstIp, unsigned short dstPort) +{ + struct sockaddr_in to; + int toLen = sizeof(to); + memset(&to,0,toLen); + + to.sin_family = AF_INET; + to.sin_port = htons(dstPort); + to.sin_addr.s_addr = htonl(dstIp); + + sendto(m_host->socket, data, length, 0,(sockaddr*)&to, toLen); +} + +uint8_t* STKHost::receiveRawPacket() +{ + uint8_t* buffer; // max size needed normally (only used for stun) + buffer = (uint8_t*)(malloc(sizeof(uint8_t)*2048)); + int len = recv(m_host->socket, buffer, 2048, 0); + + if ( len == -1 ) // socket error + { + printf("Socket Error while receiving information.\n"); + return NULL; + } + return buffer; +} + +void STKHost::broadcastPacket(char* data) +{ + ENetPacket* packet = enet_packet_create(data, strlen(data)+1,ENET_PACKET_FLAG_RELIABLE); + enet_host_broadcast(m_host, 0, packet); +} diff --git a/dev/SocketsBase/stk_host.hpp b/dev/SocketsBase/stk_host.hpp new file mode 100644 index 000000000..7d005b39b --- /dev/null +++ b/dev/SocketsBase/stk_host.hpp @@ -0,0 +1,37 @@ +#ifndef STK_HOST_HPP +#define STK_HOST_HPP + +#include + + +class STKHost +{ + friend class STKPeer; + public: + enum HOST_TYPE + { + HOST_ANY = 0, + HOST_BROADCAST = 0xFFFFFFFF, + PORT_ANY = 0 + }; + + STKHost(); + virtual ~STKHost(); + + static void* receive_data(void* self); + + void setupServer(uint32_t address, uint16_t port, int peerCount, int channelLimit, uint32_t maxIncomingBandwidth, uint32_t maxOutgoingBandwidth); + void setupClient(int peerCount, int channelLimit, uint32_t maxIncomingBandwidth, uint32_t maxOutgoingBandwidth); + + void startListening(); + + void sendRawPacket(uint8_t* data, int length, unsigned int dstIp, unsigned short dstPort); + uint8_t* receiveRawPacket(); + void broadcastPacket(char* data); + + protected: + ENetHost* m_host; + +}; + +#endif // STK_HOST_HPP diff --git a/dev/SocketsBase/stk_peer.cpp b/dev/SocketsBase/stk_peer.cpp new file mode 100644 index 000000000..290bfc2d5 --- /dev/null +++ b/dev/SocketsBase/stk_peer.cpp @@ -0,0 +1,33 @@ +#include "stk_peer.hpp" + +#include +#include + +STKPeer::STKPeer() +{ + m_peer = NULL; +} + +STKPeer::~STKPeer() +{ +} + +void STKPeer::connectToServer(STKHost* host, uint32_t ip, uint16_t port, uint32_t channelCount, uint32_t data) +{ + ENetAddress address; + address.host = ip; + address.port = port; + + m_peer = enet_host_connect(host->m_host, &address, 2, 0); + if (m_peer == NULL) + { + printf("Could not connect to server.\n"); + return; + } +} + +void STKPeer::sendPacket(char* data) +{ + ENetPacket* packet = enet_packet_create(data, strlen(data)+1,ENET_PACKET_FLAG_RELIABLE); + enet_peer_send(m_peer, 0, packet); +} diff --git a/dev/SocketsBase/stk_peer.hpp b/dev/SocketsBase/stk_peer.hpp new file mode 100644 index 000000000..eba2dea42 --- /dev/null +++ b/dev/SocketsBase/stk_peer.hpp @@ -0,0 +1,22 @@ +#ifndef STK_PEER_HPP +#define STK_PEER_HPP + +#include "stk_host.hpp" +#include + +class STKPeer +{ + public: + STKPeer(); + virtual ~STKPeer(); + + static void* receive_data(void* self); + + virtual void sendPacket(char* data); + + void connectToServer(STKHost* host, uint32_t ip, uint16_t port, uint32_t channelCount, uint32_t data); + protected: + ENetPeer* m_peer; +}; + +#endif // STK_PEER_HPP