home *** CD-ROM | disk | FTP | other *** search
- #include "Network.h"
-
- #include "log.h"
- #include "Gui.h"
-
- //#include "SDL/SDL_net.h"
- //#include "Server.h"
- //#include "Client.h"
- #include "Game.h"
- #include "PacketHandler.h"
-
- Server* Network::server = NULL;
- Client* Network::client = NULL;
-
-
- bool Network::initialized = false;
- bool Network::serverInitialized = false;
- bool Network::clientInitialized = false;
-
- bool Network::init(){
- if(initialized){
- error("(in Net::init()): Network is already initialized.\n\n");
- return false;
- }
-
- if(Gui::loadingMenu!=NULL)
- Gui::loadingMenu->updateStatusBar("initializing net");
-
- log("\n");
- log("****************************\n");
- log("*** Initializing Network ***\n");
- log("****************************\n");
- log("\n");
-
- log("Initializing SDLNet interface...\n");
- if( SDLNet_Init() == -1){
- error("(in Net::init()): SDLNet_Init() failed: %s.\n\n", SDLNet_GetError());
- return false;
- }
-
- initialized = true;
-
- return true;
- }
-
- bool Network::shutdown(){
- if(!initialized){
- error("(in Network::shutdown()): Network is not initialized.\n\n");
- return false;
- }
-
- log("\n");
- log("=============================\n");
- log("=== Shutting down Network ===\n");
- log("=============================\n");
- log("\n");
-
- if(wasClientInit()){
- log("Shutting down client...\n");
- if( !shutdownClient() ){
- return false;
- }
- }
-
- if(wasServerInit()){
- log("Shutting down server...\n");
- if( !shutdownServer() ){
- return false;
- }
- }
-
- log("Shutting down SDLNet interface...\n");
- SDLNet_Quit();
-
- initialized = false;
-
- return true;
- }
-
- bool Network::wasInit(){
- return initialized;
- }
-
- bool Network::initServer(){
- if(serverInitialized){
- error("(in Network::startServer()): There is already a server running on this machine.\n\n");
- return false;
- }
-
- log("\n");
- log("***************************\n");
- log("*** Initializing Server ***\n");
- log("***************************\n");
- log("\n");
-
- info.cvar.network_server_name->updateVar();
- info.cvar.network_server_description->updateVar();
- info.cvar.network_server_hostName->updateVar();
- info.cvar.network_server_port->updateVar();
- info.cvar.network_server_maxClients->updateVar();
-
- server = new Server();
-
- if( !Game::info.var.clientGame ){ // not a client game -> open server port
- if(server->openPort()){
- log("Port opened (UDP: %i).\n", info.var.server_port);
- }else{
- error("in Network::initServer(): Couldn't open server port (UDP: %i).\n\n", info.var.server_port);
- return false;
- }
- log("Server ready.\n");
- }else{ // client game -> just prepare a shadow server
- if(SDLNet_ResolveHost(&server->ipAddress, info.var.server_hostName, info.var.server_port) == -1){
- //error("(in Network::initServer()): SDLNet_ResolveHost() failed: %s.\n\n", SDLNet_GetError());
- error("(in Network::initServer()): Unknown host: '%s'.\n\n", info.var.server_hostName);
- return false;
- }else{
- char buff[128];
- Network::ipAddressToString(server->ipAddress, buff);
- log("Hostname '%s' resolved. IP: '%s'\n", info.var.server_hostName, buff);
- }
- log("Prepared shadow server for client game.\n");
- }
-
- serverInitialized = true;
-
- return true;
- }
-
- bool Network::shutdownServer(){
- if( !serverInitialized ){
- error("(in Network::shutdownServer()): No server running on this machine.\n\n");
- return false;
- }
-
- log("\n");
- log("============================\n");
- log("=== Shutting down Server ===\n");
- log("============================\n");
- log("\n");
-
- if( !Game::info.var.clientGame ){
- log("Disconnecting clients...\n");
- if( !server->disconnectAllClients("Server is shutting down.") ){
- error("(in Network::shutdownServer()): server->disconnect failed.\n\n");
- return false;
- }
-
- log("Closing port...\n");
- if( !server->closePort() ){
- error("(in Network::shutdownServer()): server->closePort failed.\n\n");
- return false;
- }
-
- log("Server down.\n");
- }else{
- log("Shadow server down.\n");
- }
-
- delete server;
- server = NULL;
-
- serverInitialized = false;
-
- return true;
- }
-
- bool Network::wasServerInit(){
- return serverInitialized;
- }
-
-
-
- bool Network::initClient(){
- if( clientInitialized ){
- error("(in Network::initClient()): There is already a client running on this machine.\n\n");
- return false;
- }
-
- log("\n");
- log("***************************\n");
- log("*** Initializing Client ***\n");
- log("***************************\n");
- log("\n");
-
- info.cvar.network_client_ip->updateVar();
- info.cvar.network_client_port->updateVar();
-
- client = new Client();
-
- if(client->openPort()){
- log("Port opened (UDP: %d).\n", info.var.client_port);
- }else{
- error("(in Network::initClient()): Couldn't open clientPort (UDP: %d).\n\n", info.var.client_port);
- return false;
- }
-
- log("Client ready.\n");
- clientInitialized = true;
-
- return true;
- }
-
- bool Network::shutdownClient(){
- if( !clientInitialized ){
- error("(in Network::shutdownClient()): No client running on this machine.\n\n");
- return false;
- }
-
- log("\n");
- log("============================\n");
- log("=== Shutting down Client ===\n");
- log("============================\n");
- log("\n");
-
- if( Game::info.var.clientGame && client->clientId != -1){ // client game and conencted
- log("Disconnecting from server...\n");
- if( !client->disconnect() ){
- error("(in Network::shutdownClient()): client->disconnect failed.\n\n");
- return false;
- }
- }else{ // local client or not conected
- //Network::server->removeClient(Network::client);
-
- }
-
- log("Closing port...\n");
- if( !client->closePort() ){
- error("(in Network::shutdownClient()): client->closePort failed.\n\n");
- return false;
- }
-
- delete client;
- client = NULL;
-
- clientInitialized = false;
-
- log("Client down.\n");
-
- return true;
- }
-
- bool Network::wasClientInit(){
- return clientInitialized;
- }
-
-
-
- bool Network::registerCVarsAndCCmds(){
-
- return info.registerCVarsAndCCmds();
- }
-
- bool Network::unregisterCVarsAndCCmds(){
- return info.unregisterCVarsAndCCmds();
- }
-
-
-
-
-
-
-
-
-
-
- void Network::sendAndReceive(){
-
- if(clientInitialized){
- client->sendPackets();
- client->receivePackets();
- }
-
- if(serverInitialized && !Game::info.var.clientGame){
- server->sendPackets();
- server->receivePackets();
- }
- }
-
- bool Network::makeLoopbackConnection(){
- if( !serverInitialized ){
- error("(in Network::makeLoopbackConnection()): No server running on this machine.\n\n");
- return false;
- }
-
- if( !clientInitialized ){
- error("(in Network::makeLoopbackConnection()): No client running on this machine.\n\n");
- return false;
- }
-
- log("Making loopback connection to '%s' (%s:%d)...\n", info.var.server_name, info.var.server_ip, info.var.server_port);
-
- client->clientId = server->addClient(client); // should be 0
- server->localClient = client;
-
- // send test packet
-
- UDPpacket* p = SDLNet_AllocPacket(2);
- if( p == NULL ){
- error("(in Network::makeLoopbackConnection()): Couldn't alloc packet.\n\n");
- return false;
- }
-
- p->address.host = server->ipAddress.host;
- p->address.port = server->ipAddress.port;
-
- p->data[0] = (unsigned char)NETWORK_FWP_PACKET_ID;
- p->data[1] = (unsigned char)PACKET_TYPE_PING;
-
- p->channel = -1;
- p->len = 2;
-
- for(int i=0;i<info.var.client_maxConnectionAttempts;i++){
-
- log("Sending test packet (try %i)...\n", i+1);
- if( !sendPacket(client->socket, p) ){
- error("(in Network::makeLoopbackConnection()): Couldn't send packet.\n\n");
- SDLNet_FreePacket(p);
- return false;
- }
-
- UDPpacket* answer = NULL;
- do{
- answer = Network::receivePacket(server->socket);
- if( answer != NULL ){
- if(answer->data[1] == PACKET_TYPE_PING){
- log("Received test packet.\n");
-
- client->ipAddress.host = answer->address.host;
- client->ipAddress.port = answer->address.port;
-
- SDLNet_FreePacket(answer);
- SDLNet_FreePacket(p);
-
- log("Loopback connection established.");
-
-
- return true;
- }else{
- warn("(in Network::makeLoopbackConnection()): Received unexpected packet from server.\n\n");
- SDLNet_FreePacket(answer);
- }
- }
- }while( answer != NULL );
- }
-
- SDLNet_FreePacket(p);
- error("(in Network::makeLoopbackConnection()): Couldn't receive test packet. Giving up.\n\n");
- return false;
-
- }
-
-
- bool Network::sendPacket(UDPsocket socket, UDPpacket* p){
- int n = SDLNet_UDP_Send(socket, -1, p);
- if( n == 0 ){
- return false;
- }
-
- return true;
- }
-
- bool Network::sendAndFreePacket(UDPsocket socket, UDPpacket* p){
- int n = SDLNet_UDP_Send(socket, -1, p);
- SDLNet_FreePacket(p);
- if( n == 0 ){
- return false;
- }
-
- return true;
- }
-
- UDPpacket* Network::receivePacket(UDPsocket socket){
- UDPpacket* p = SDLNet_AllocPacket(NETWORK_MAX_PACKET_SIZE);
- if(p == NULL){
- error("(in Network::receivePacket()): Couldn't alloc packet.\n\n");
- return NULL;
- }
- int n = SDLNet_UDP_Recv(socket, p);
- if(n == 1){ // ok
- if(p->len >= 2 && p->data[0] == NETWORK_FWP_PACKET_ID && p->data[1] < NUM_PACKET_TYPES){
- return p;
- }else{
- return NULL;
- }
-
- }else if(n == 0){ // nothing received
- return NULL;
- }else if(n == -1){ // error
- error("(in Network::receivePacket()): SDLNet_UDP_Recv() failed: %s.\n\n", SDLNet_GetError());
- return NULL;
- }else{
- return NULL;
- }
- }
-
- void Network::ipAddressToString(IPaddress ip, char* buff){
- char tmp[64];
-
- buff[0] = '\0';
- sprintf(tmp, "%d.", (ip.host & 0x000000FF));
- strcat(buff, tmp);
- sprintf(tmp, "%d.", (ip.host & 0x0000FF00) >> 8);
- strcat(buff, tmp);
- sprintf(tmp, "%d.", (ip.host & 0x00FF0000) >> 16);
- strcat(buff, tmp);
- sprintf(tmp, "%d:", (ip.host & 0xFF000000) >> 24);
- strcat(buff, tmp);
- sprintf(tmp, "%d", ip.port);
- strcat(buff, tmp);
- }
-