mirror of
https://github.com/KranX/Vangers.git
synced 2025-12-01 07:25:28 +07:00
fix server problems
This commit is contained in:
@@ -3,14 +3,12 @@
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
#define VERSION "1.9"
|
||||
#define VERSION "1.9"
|
||||
/* --------------------------- PROTOTYPE SECTION --------------------------- */
|
||||
void ComlineAnalyze(int argc,char** argv);
|
||||
void terminal();
|
||||
void ComlineAnalyze(int argc, char **argv);
|
||||
|
||||
/* --------------------------- DEFINITION SECTION -------------------------- */
|
||||
struct KDsPlus : XRuntimeObject
|
||||
{
|
||||
struct KDsPlus: XRuntimeObject {
|
||||
virtual int Quant(void);
|
||||
};
|
||||
|
||||
@@ -21,49 +19,47 @@ int time_to_live = 0;
|
||||
int ErrHExcept = 1;
|
||||
int GlobalExit = 0;
|
||||
int terminal_log = 0;
|
||||
char* result_name = 0;
|
||||
char *result_name = 0;
|
||||
int StatLogging = 0;
|
||||
int leave_empty_games = 0;
|
||||
Server* server;
|
||||
Server *server;
|
||||
|
||||
int xtInitApplication(void) {
|
||||
#ifdef _WIN32
|
||||
SetConsoleTitle("Vangers Server ");
|
||||
#else
|
||||
std::cout << "\033]0;" << "Vangers Server " << "\007";
|
||||
std::cout << "\033]0;"
|
||||
<< "Vangers Server "
|
||||
<< "\007";
|
||||
#endif
|
||||
std::cout << "Multiplayer VANGERS Server by K-D LAB\nRelease Version " VERSION " (c) 1998 All Rights Reserved\n";
|
||||
std::cout << "Compilation: DATE: " << __DATE__ << " TIME: " << __TIME__ << "\n\n";
|
||||
std::cout << "Multiplayer VANGERS Server by K-D LAB\nRelease Version " VERSION
|
||||
" (c) 1998 All Rights Reserved\n";
|
||||
std::cout << "Compilation: DATE: " << __DATE__ << " TIME: " << __TIME__ << "\n\n";
|
||||
|
||||
//SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
|
||||
ComlineAnalyze(__argc,__argv);
|
||||
// ErrH.SetFlags(XERR_CTRLBRK);
|
||||
// SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
|
||||
ComlineAnalyze(__argc, __argv);
|
||||
// ErrH.SetFlags(XERR_CTRLBRK);
|
||||
|
||||
/* initialize SDL */
|
||||
if(SDL_Init(0)==-1) {
|
||||
std::cout<<"SDL_Init: %s\n"<<SDL_GetError()<<std::endl;
|
||||
if (SDL_Init(0) == -1) {
|
||||
std::cout << "SDL_Init: %s\n" << SDL_GetError() << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if(!XSocketInit())
|
||||
if (!XSocketInit())
|
||||
ErrH.Abort("WinSock initialization failed, check Your TCP/IP settings");
|
||||
|
||||
// if(terminal_log) {
|
||||
// terminal();
|
||||
// return -1;
|
||||
// }
|
||||
|
||||
server = new Server(default_server_port, broadcast_port, time_to_live);
|
||||
|
||||
#ifdef _DEBUG
|
||||
if(result_name) {
|
||||
(server -> create_game()) -> load_result(server,result_name);
|
||||
if (result_name) {
|
||||
(server->create_game())->load_result(server, result_name);
|
||||
ErrH.Abort("Result loaded");
|
||||
}
|
||||
#endif
|
||||
|
||||
KDsPlus* p = new KDsPlus;
|
||||
|
||||
KDsPlus *p = new KDsPlus;
|
||||
|
||||
xtCreateRuntimeObjectTable();
|
||||
xtRegisterRuntimeObject(p);
|
||||
|
||||
@@ -75,93 +71,73 @@ void xtDoneApplication(void) {
|
||||
}
|
||||
|
||||
void Syncro() {
|
||||
const int dt_total = 1000/64;
|
||||
const int dt_total = 1000 / 64;
|
||||
static int t_prev = 0;
|
||||
int dt = dt_total - (clock() - t_prev);
|
||||
if(dt > 0)
|
||||
if (dt > 0)
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(dt));
|
||||
t_prev = clock();
|
||||
}
|
||||
|
||||
int KDsPlus::Quant(void) {
|
||||
//if(GlobalExit || XKey.Pressed(VK_ESCAPE)) return XT_TERMINATE_ID;
|
||||
//TODO: I hope you can stop server by ctrl+c
|
||||
if(GlobalExit)
|
||||
// if(GlobalExit || XKey.Pressed(VK_ESCAPE)) return XT_TERMINATE_ID;
|
||||
// TODO: I hope you can stop server by ctrl+c
|
||||
if (GlobalExit)
|
||||
return XT_TERMINATE_ID;
|
||||
frame++;
|
||||
Syncro();
|
||||
server -> quant();
|
||||
server->quant();
|
||||
DBGCHECK
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ComlineAnalyze(int argc,char** argv) {
|
||||
int i,j;
|
||||
for(i = 1;i < argc;i++)
|
||||
if(argv[i][0] == '/'){
|
||||
void ComlineAnalyze(int argc, char **argv) {
|
||||
int i, j;
|
||||
for (i = 1; i < argc; i++)
|
||||
if (argv[i][0] == '/') {
|
||||
j = 0;
|
||||
while(argv[i][j] == '/' || argv[i][j] == '-'){
|
||||
switch(argv[i][j + 1]){
|
||||
case 'p':
|
||||
default_server_port = atoi(argv[i] + (j + 2));
|
||||
break;
|
||||
case 'b':
|
||||
if(argv[i][j + 2] == '-')
|
||||
broadcast_port = 0;
|
||||
else
|
||||
broadcast_port = atoi(argv[i] + (j + 2));
|
||||
break;
|
||||
case 't':
|
||||
time_to_live = atoi(argv[i] + (j + 2));
|
||||
std::cout << "Time to Live: " << time_to_live << " second\n";
|
||||
break;
|
||||
case 'i':
|
||||
//TODO: looks like only windows strange function
|
||||
//FreeConsole();
|
||||
break;
|
||||
case 's':
|
||||
std::cout << "Logging ON\n";
|
||||
StatLogging = 1;
|
||||
break;
|
||||
case 'l':
|
||||
std::cout << "Empty games will not be removed\n";
|
||||
leave_empty_games = 1;
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
std::cout << "Switches: \n /pxxxx - main TCP/IP port \n /bxxxx - UDP broadcast port \n /b- - supress UDP broadcast \n /i - invisible mode \n /txxx - time to live without clients, seconds\n /s - creates log file (VangersServer.log)\n /l - leave empty games\n\n";
|
||||
break;
|
||||
}
|
||||
j+=2;
|
||||
while (argv[i][j] == '/' || argv[i][j] == '-') {
|
||||
switch (argv[i][j + 1]) {
|
||||
case 'p':
|
||||
default_server_port = atoi(argv[i] + (j + 2));
|
||||
break;
|
||||
case 'b':
|
||||
if (argv[i][j + 2] == '-')
|
||||
broadcast_port = 0;
|
||||
else
|
||||
broadcast_port = atoi(argv[i] + (j + 2));
|
||||
break;
|
||||
case 't':
|
||||
time_to_live = atoi(argv[i] + (j + 2));
|
||||
std::cout << "Time to Live: " << time_to_live << " second\n";
|
||||
break;
|
||||
case 'i':
|
||||
// TODO: looks like only windows strange function
|
||||
// FreeConsole();
|
||||
break;
|
||||
case 's':
|
||||
std::cout << "Logging ON\n";
|
||||
StatLogging = 1;
|
||||
break;
|
||||
case 'l':
|
||||
std::cout << "Empty games will not be removed\n";
|
||||
leave_empty_games = 1;
|
||||
break;
|
||||
case 'h':
|
||||
case '?':
|
||||
std::cout << "Switches: \n"
|
||||
<< " /pxxxx - main TCP/IP port \n"
|
||||
<< " /bxxxx - UDP broadcast port \n"
|
||||
<< " /b- - supress UDP broadcast \n"
|
||||
<< " /i - invisible mode \n"
|
||||
<< " /txxx - time to live without clients, seconds\n"
|
||||
<< " /s - creates log file (VangersServer.log)\n"
|
||||
<< " /l - leave empty games\n"
|
||||
<< "\n";
|
||||
break;
|
||||
}
|
||||
j += 2;
|
||||
}
|
||||
else
|
||||
} else
|
||||
result_name = argv[i];
|
||||
}
|
||||
|
||||
/*
|
||||
void terminal()
|
||||
{
|
||||
XCon < "MP TERMINAL:\n\n";
|
||||
XSocket sock;
|
||||
//if(!sock.open_by_socks5("etype0.enet.ru",1973,"toothelator"))
|
||||
if(!sock.open_by_socks5("mike.nevalink.ru",1973,"toothelator"))
|
||||
//if(!sock.open("localhost",1973))
|
||||
//if(!sock.open("mike.nevalink.ru",1973))
|
||||
return;
|
||||
OutputEventBuffer out(100);
|
||||
XBuffer in(2000);
|
||||
out.begin_event(META_OPEN_LOG);
|
||||
out.end_event();
|
||||
out.send(sock);
|
||||
int counter = 0;
|
||||
while(sock()){
|
||||
int len = sock.receive(in,in.length());
|
||||
in[len] = 0;
|
||||
XCon < in < " " <= (counter++ % 10) < " " < "\b\b\b";
|
||||
in.init();
|
||||
Syncro();
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
@@ -2,27 +2,20 @@
|
||||
#ifndef KDSPLUS_H
|
||||
#define KDSPLUS_H
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#define WIN32_EXTRA_LEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
|
||||
#ifdef _WINDOWS_
|
||||
#include <windows.h>
|
||||
# include <windows.h>
|
||||
#endif
|
||||
|
||||
#define KDWIN
|
||||
|
||||
//#include "../lib/xtool/xtcore.h"
|
||||
//#include "../lib/xtool/xerrhand.h"
|
||||
//#include "../lib/xtool/xstream.h"
|
||||
//#include "../lib/xtool/xglobal.h"
|
||||
//#include "xsocket.h"
|
||||
#include "server.h"
|
||||
|
||||
extern int frame;
|
||||
@@ -33,9 +26,9 @@ extern int leave_empty_games;
|
||||
|
||||
#ifdef _DEBUG
|
||||
void win32_check();
|
||||
#define DBGCHECK win32_check();
|
||||
# define DBGCHECK win32_check();
|
||||
#else
|
||||
#define DBGCHECK
|
||||
# define DBGCHECK
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
3135
server/server.cpp
3135
server/server.cpp
File diff suppressed because it is too large
Load Diff
322
server/server.h
322
server/server.h
@@ -1,18 +1,17 @@
|
||||
#include "../lib/xtool/xglobal.h"
|
||||
#include "xsocket.h"
|
||||
#include "multiplayer.h"
|
||||
#include "xsocket.h"
|
||||
|
||||
#define DIRECT_SENDING_OBJECT 1
|
||||
|
||||
#define IN_BUFFER_SIZE 128000
|
||||
#define OUT_BUFFER_SIZE 128000
|
||||
#define OUT_QUEUE_SIZE (1 << 10)
|
||||
#define IN_BUFFER_META_SIZE 4000
|
||||
#define OUT_BUFFER_META_SIZE 20000
|
||||
#define Y_SHIFT 2
|
||||
#define PLAYERS_RADIUS 128
|
||||
#define WAITING_TO_REMOVE (60*1000)
|
||||
#define DIRECT_SENDING_OBJECT 1
|
||||
|
||||
#define IN_BUFFER_SIZE 128000
|
||||
#define OUT_BUFFER_SIZE 128000
|
||||
#define OUT_QUEUE_SIZE (1 << 10)
|
||||
#define IN_BUFFER_META_SIZE 4000
|
||||
#define OUT_BUFFER_META_SIZE 20000
|
||||
#define Y_SHIFT 2
|
||||
#define PLAYERS_RADIUS 128
|
||||
#define WAITING_TO_REMOVE (60 * 1000)
|
||||
|
||||
/*******************************************************************************
|
||||
Structures
|
||||
@@ -24,51 +23,91 @@ struct World;
|
||||
|
||||
struct Event {
|
||||
int code;
|
||||
Player* pointer;
|
||||
|
||||
Event(){ code = 0; pointer = 0; }
|
||||
Event(int cd){ code = cd; pointer = 0; }
|
||||
Event(int cd,Player* ptr){ code = cd; pointer = ptr; }
|
||||
int operator == (Event& ev) { return code == ev.code && pointer == ev.pointer; }
|
||||
int operator != (Event& ev) { return code != ev.code || pointer != ev.pointer; }
|
||||
Player *pointer;
|
||||
|
||||
Event() {
|
||||
code = 0;
|
||||
pointer = 0;
|
||||
}
|
||||
Event(int cd) {
|
||||
code = cd;
|
||||
pointer = 0;
|
||||
}
|
||||
Event(int cd, Player *ptr) {
|
||||
code = cd;
|
||||
pointer = ptr;
|
||||
}
|
||||
int operator==(Event &ev) {
|
||||
return code == ev.code && pointer == ev.pointer;
|
||||
}
|
||||
int operator!=(Event &ev) {
|
||||
return code != ev.code || pointer != ev.pointer;
|
||||
}
|
||||
};
|
||||
|
||||
class OutputEventBuffer : public XBuffer {
|
||||
class OutputEventBuffer: public XBuffer {
|
||||
unsigned int pointer_to_size_of_event;
|
||||
|
||||
public:
|
||||
OutputEventBuffer(unsigned int size);
|
||||
public:
|
||||
OutputEventBuffer(unsigned int size);
|
||||
|
||||
int send(XSocket& sock);
|
||||
int send(XSocket &sock);
|
||||
void begin_event(int event_ID);
|
||||
void end_event();
|
||||
};
|
||||
};
|
||||
|
||||
class InputEventBuffer : public XBuffer {
|
||||
class InputEventBuffer: public XBuffer {
|
||||
int event_ID;
|
||||
int size_of_event;
|
||||
|
||||
unsigned int next_event_pointer;
|
||||
unsigned int filled_size;
|
||||
|
||||
public:
|
||||
public:
|
||||
InputEventBuffer(unsigned int size);
|
||||
void reset();
|
||||
|
||||
int receive(XSocket& sock);
|
||||
int current_event(){ return event_ID; }
|
||||
int event_size(){ return size_of_event; }
|
||||
int next_event();
|
||||
int receive(XSocket &sock);
|
||||
int current_event() {
|
||||
return event_ID;
|
||||
}
|
||||
int event_size() {
|
||||
return size_of_event;
|
||||
}
|
||||
int next_event();
|
||||
void ignore_event();
|
||||
|
||||
int get_byte(){ unsigned char t; *this > t; return (int)t; }
|
||||
int get_short(){ short t; *this > t; return (int)t; }
|
||||
int get_word(){ unsigned short t; *this > t; return (int)t; }
|
||||
int get_int(){ int t; *this > t; return (int)t; }
|
||||
unsigned int get_dword(){ unsigned int t; *this > t; return (unsigned int )t; }
|
||||
double get_float(){ float t; *this > t; return (double)t; }
|
||||
};
|
||||
|
||||
int get_byte() {
|
||||
unsigned char t;
|
||||
*this > t;
|
||||
return (int)t;
|
||||
}
|
||||
int get_short() {
|
||||
short t;
|
||||
*this > t;
|
||||
return (int)t;
|
||||
}
|
||||
int get_word() {
|
||||
unsigned short t;
|
||||
*this > t;
|
||||
return (int)t;
|
||||
}
|
||||
int get_int() {
|
||||
int t;
|
||||
*this > t;
|
||||
return (int)t;
|
||||
}
|
||||
unsigned int get_dword() {
|
||||
unsigned int t;
|
||||
*this > t;
|
||||
return (unsigned int)t;
|
||||
}
|
||||
double get_float() {
|
||||
float t;
|
||||
*this > t;
|
||||
return (double)t;
|
||||
}
|
||||
};
|
||||
|
||||
struct Object {
|
||||
int ID;
|
||||
@@ -79,23 +118,22 @@ struct Object {
|
||||
unsigned int send_hide;
|
||||
unsigned int send_delete;
|
||||
int time;
|
||||
int x,y,radius;
|
||||
|
||||
int x, y, radius;
|
||||
|
||||
int body_size;
|
||||
int death_body_size;
|
||||
unsigned char* body;
|
||||
|
||||
Object* next;
|
||||
Object* prev;
|
||||
XTList<Object>* list;
|
||||
unsigned char *body;
|
||||
|
||||
Object* next_alt;
|
||||
Object* prev_alt;
|
||||
XTListAlt<Object>* list_alt;
|
||||
Object *next;
|
||||
Object *prev;
|
||||
XTList<Object> *list;
|
||||
|
||||
|
||||
Object();
|
||||
~Object();
|
||||
Object *next_alt;
|
||||
Object *prev_alt;
|
||||
XTListAlt<Object> *list_alt;
|
||||
|
||||
Object();
|
||||
~Object();
|
||||
};
|
||||
|
||||
struct World {
|
||||
@@ -103,36 +141,36 @@ struct World {
|
||||
int V_SIZE;
|
||||
int number_of_objects;
|
||||
int number_of_y_lists;
|
||||
XTList<Object>* y_lists;
|
||||
XTList<Object> *y_lists;
|
||||
XTListAlt<Object> objects;
|
||||
|
||||
XTListAlt<Player> current_players;
|
||||
|
||||
World* next;
|
||||
World* prev;
|
||||
XTList<World>* list;
|
||||
|
||||
World(int ID,int V_SIZE);
|
||||
~World();
|
||||
World *next;
|
||||
World *prev;
|
||||
XTList<World> *list;
|
||||
|
||||
void attach_player(Player* player);
|
||||
void detach_player(Player* player);
|
||||
World(int ID, int V_SIZE);
|
||||
~World();
|
||||
|
||||
Object* search_object(int ID);
|
||||
void attach_player(Player *player);
|
||||
void detach_player(Player *player);
|
||||
|
||||
void add_object(Object* obj);
|
||||
void move_object(Object* obj);
|
||||
void delete_object(Object* obj);
|
||||
Object *search_object(int ID);
|
||||
|
||||
int getDistY(int v0,int v1);
|
||||
int check_visibility(Player* player,Object* object);
|
||||
int check_visibility(Player* p1,Player* p2);
|
||||
void process_create(Player* player,Object* obj);
|
||||
void process_update(Player* player,Object* object);
|
||||
void process_delete(Object* obj);
|
||||
void process_set_position(Player* player);
|
||||
void process_create_inventory(Player* player,Object* obj);
|
||||
void process_update_inventory(Player* player,Object* obj);
|
||||
void add_object(Object *obj);
|
||||
void move_object(Object *obj);
|
||||
void delete_object(Object *obj);
|
||||
|
||||
int getDistY(int v0, int v1);
|
||||
int check_visibility(Player *player, Object *object);
|
||||
int check_visibility(Player *p1, Player *p2);
|
||||
void process_create(Player *player, Object *obj);
|
||||
void process_update(Player *player, Object *object);
|
||||
void process_delete(Object *obj);
|
||||
void process_set_position(Player *player);
|
||||
void process_create_inventory(Player *player, Object *obj);
|
||||
void process_update_inventory(Player *player, Object *obj);
|
||||
};
|
||||
|
||||
struct Player {
|
||||
@@ -141,23 +179,23 @@ struct Player {
|
||||
int client_version;
|
||||
int client_mask;
|
||||
int status;
|
||||
char* name;
|
||||
char* password;
|
||||
char *name;
|
||||
char *password;
|
||||
|
||||
Server* server;
|
||||
Game* game;
|
||||
World* world;
|
||||
int x,y;
|
||||
Server *server;
|
||||
Game *game;
|
||||
World *world;
|
||||
int x, y;
|
||||
int y_half_size_of_screen;
|
||||
int x_prev,y_prev;
|
||||
int x_prev, y_prev;
|
||||
int y_half_size_of_screen_prev;
|
||||
|
||||
PlayerBody body;
|
||||
float prev_rating;
|
||||
|
||||
XTList<Object> inventory;
|
||||
|
||||
//Object* current_sent_object;
|
||||
XTList<Object> inventory;
|
||||
|
||||
// Object* current_sent_object;
|
||||
unsigned int birth_time;
|
||||
unsigned int last_sent_position;
|
||||
unsigned int last_IO_operation;
|
||||
@@ -167,25 +205,25 @@ struct Player {
|
||||
XSocket socket;
|
||||
InputEventBuffer in_buffer;
|
||||
OutputEventBuffer out_buffer;
|
||||
XQueue<Object*> object_queue;
|
||||
XQueue<Object *> object_queue;
|
||||
XQueue<Event> code_queue;
|
||||
|
||||
Player* next;
|
||||
Player* prev;
|
||||
XTList<Player>* list;
|
||||
Player *next;
|
||||
Player *prev;
|
||||
XTList<Player> *list;
|
||||
|
||||
Player* next_alt;
|
||||
Player* prev_alt;
|
||||
XTListAlt<Player>* list_alt;
|
||||
|
||||
Player(Server* server,XSocket& sock);
|
||||
~Player();
|
||||
Player *next_alt;
|
||||
Player *prev_alt;
|
||||
XTListAlt<Player> *list_alt;
|
||||
|
||||
Player(Server *server, XSocket &sock);
|
||||
~Player();
|
||||
|
||||
void identification();
|
||||
int is_alive();
|
||||
int receive();
|
||||
int send();
|
||||
void put_object(Object* object);
|
||||
void put_object(Object *object);
|
||||
void clear_object_queue(int keep_globals);
|
||||
};
|
||||
|
||||
@@ -196,53 +234,53 @@ struct Game {
|
||||
XTList<Player> players;
|
||||
XTList<Player> removed_players;
|
||||
XTList<World> worlds;
|
||||
XTList<Object> global_objects;
|
||||
XTList<Object> global_objects;
|
||||
|
||||
unsigned int birth_time;
|
||||
char name[128];
|
||||
ServerData data;
|
||||
|
||||
Game* next;
|
||||
Game* prev;
|
||||
XTList<Game>* list;
|
||||
Game *next;
|
||||
Game *prev;
|
||||
XTList<Game> *list;
|
||||
|
||||
Game(int ID);
|
||||
~Game();
|
||||
|
||||
int attach_player(Player* player);
|
||||
void detach_player(Player* player);
|
||||
Game(int ID);
|
||||
~Game();
|
||||
|
||||
int attach_player(Player *player);
|
||||
void detach_player(Player *player);
|
||||
|
||||
int quant();
|
||||
|
||||
void get_object_ID_offsets(OutputEventBuffer& out_buffer,int client_ID);
|
||||
void put_event_for_all(int code,Player* player = 0);
|
||||
void process_direct_sending(Object* obj,unsigned int mask);
|
||||
void get_total_list_of_players_data(OutputEventBuffer& out_buffer);
|
||||
void get_object_ID_offsets(OutputEventBuffer &out_buffer, int client_ID);
|
||||
void put_event_for_all(int code, Player *player = 0);
|
||||
void process_direct_sending(Object *obj, unsigned int mask);
|
||||
void get_total_list_of_players_data(OutputEventBuffer &out_buffer);
|
||||
|
||||
void check_global_objects(Player *player);
|
||||
void process_create_globals(Player *player, Object *obj);
|
||||
void process_update_globals(Player *player, Object *obj);
|
||||
void process_delete_globals(Object *obj);
|
||||
|
||||
void check_global_objects(Player* player);
|
||||
void process_create_globals(Player* player,Object* obj);
|
||||
void process_update_globals(Player* player,Object* obj);
|
||||
void process_delete_globals(Object* obj);
|
||||
|
||||
void process_VAN_WAR_ratings();
|
||||
void process_MECHOSOMA_ratings();
|
||||
void process_PASSEMBLOSS_ratings();
|
||||
void save_result();
|
||||
void load_result(Server* server,char* name);
|
||||
void load_result(Server *server, char *name);
|
||||
};
|
||||
|
||||
struct RatingData {
|
||||
char* name;
|
||||
char* password;
|
||||
char *name;
|
||||
char *password;
|
||||
int MP_game;
|
||||
float rating;
|
||||
|
||||
RatingData(char* _name,char* _password,int MP_game,float rating);
|
||||
~RatingData();
|
||||
RatingData(char *_name, char *_password, int MP_game, float rating);
|
||||
~RatingData();
|
||||
|
||||
RatingData* next;
|
||||
RatingData* prev;
|
||||
XTList<RatingData>* list;
|
||||
RatingData *next;
|
||||
RatingData *prev;
|
||||
XTList<RatingData> *list;
|
||||
};
|
||||
|
||||
struct Server {
|
||||
@@ -258,43 +296,41 @@ struct Server {
|
||||
unsigned int time_to_live;
|
||||
unsigned int time_to_destroy;
|
||||
int next_broadcast;
|
||||
XSocket broadcast_socket;
|
||||
|
||||
int n_games[NUMBER_MP_GAMES];
|
||||
int n_players_max[NUMBER_MP_GAMES], n_players_sum[NUMBER_MP_GAMES];
|
||||
int playing_time_max[NUMBER_MP_GAMES], playing_time_sum[NUMBER_MP_GAMES];
|
||||
|
||||
Server(int main_port,int broadcast_port,int time_to_live);
|
||||
~Server();
|
||||
void clear();
|
||||
|
||||
Game* create_game();
|
||||
|
||||
Server(int main_port, int broadcast_port, int time_to_live);
|
||||
~Server();
|
||||
void clear();
|
||||
|
||||
Game *create_game();
|
||||
int quant();
|
||||
int check_new_clients();
|
||||
int clients_quant();
|
||||
int games_quant();
|
||||
void get_games_list(OutputEventBuffer& out_buffer,int client_version);
|
||||
void analyse_statistics(Game* g);
|
||||
void get_games_list(OutputEventBuffer &out_buffer, int client_version);
|
||||
void analyse_statistics(Game *g);
|
||||
void report();
|
||||
|
||||
void load_rating_list(const char* name);
|
||||
void save_rating_list(const char* name);
|
||||
RatingData* search_rating_data(char* player_name, char* player_password, int MP_game);
|
||||
void add_rating_data(Player* player, int MP_game);
|
||||
void get_top_list(OutputEventBuffer& out_buffer,int MP_game);
|
||||
void consoleReport(int players);
|
||||
void load_rating_list(const char *name);
|
||||
void save_rating_list(const char *name);
|
||||
RatingData *search_rating_data(char *player_name, char *player_password, int MP_game);
|
||||
void add_rating_data(Player *player, int MP_game);
|
||||
void get_top_list(OutputEventBuffer &out_buffer, int MP_game);
|
||||
};
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Defines
|
||||
*******************************************************************************/
|
||||
#define GLOBAL_CLOCK() (round(clock()*(256./CLOCKS_PER_SEC)))
|
||||
#define SECONDS() (round(clock()*(1./CLOCKS_PER_SEC)))
|
||||
#define SERVER_ERROR(str,code) ErrH.Abort(str,XERR_USER,code)
|
||||
|
||||
#define START_TIMER(interval) unsigned int _end_time_ = clock() + interval;
|
||||
#define CHECK_TIMER() ((int)(clock() - _end_time_) < 0)
|
||||
#define IS_FUTURE(time) ((int)((time) - clock()) > 0)
|
||||
#define IS_PAST(time) ((int)(clock() - (time)) > 0)
|
||||
#define TIME_INTERVAL(time) ((int)(clock() - (time)))
|
||||
#define GLOBAL_CLOCK() (round(clock() * (256. / CLOCKS_PER_SEC)))
|
||||
#define SECONDS() (round(clock() * (1. / CLOCKS_PER_SEC)))
|
||||
#define SERVER_ERROR(str, code) ErrH.Abort(str, XERR_USER, code)
|
||||
|
||||
#define START_TIMER(interval) unsigned int _end_time_ = clock() + interval;
|
||||
#define CHECK_TIMER() ((int)(clock() - _end_time_) < 0)
|
||||
#define IS_FUTURE(time) ((int)((time)-clock()) > 0)
|
||||
#define IS_PAST(time) ((int)(clock() - (time)) > 0)
|
||||
#define TIME_INTERVAL(time) ((int)(clock() - (time)))
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
|
||||
#include "../xsocket.h"
|
||||
|
||||
const char TG_NO_TOUCH = 1;
|
||||
const char TG_POINT_TOUCH = 2;
|
||||
const char TG_SPHERICAL_TOUCH = 3;
|
||||
|
||||
@@ -626,13 +626,13 @@ void iQuantFirst(void)
|
||||
iSetOptionValueCHR(iPLAYER_NAME2,"Vanger");
|
||||
iSetOptionValueCHR(iPLAYER_PASSWORD,iSTR_DefaultPassword);
|
||||
if(lang() == RUSSIAN) {
|
||||
iSetOptionValueCHR(iHOST_NAME, "vangers.pp.ru");
|
||||
iSetOptionValueCHR(iHOST_NAME, "vangers.anime-pictures.net");
|
||||
} else if (lang() == GERMAN) {
|
||||
// iSetOptionValueCHR(iHOST_NAME,"www.imagicgames.de");
|
||||
iSetOptionValueCHR(iHOST_NAME,"vangers.pp.ru");
|
||||
iSetOptionValueCHR(iHOST_NAME,"vangers.anime-pictures.net");
|
||||
}
|
||||
else
|
||||
iSetOptionValueCHR(iHOST_NAME,"vangers.pp.ru");
|
||||
iSetOptionValueCHR(iHOST_NAME,"vangers.anime-pictures.net");
|
||||
// iSetOptionValueCHR(iHOST_NAME,"www.imagicgames.com");
|
||||
iSetOptionValueCHR(iSERVER_NAME,iSTR_NONE);
|
||||
iSetOptionValueCHR(iPROXY_SERVER,"192.1.1.1");
|
||||
|
||||
@@ -9,14 +9,14 @@
|
||||
#define AUXILIARY_EVENT 0x80
|
||||
#define ECHO_EVENT 0x20
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// Отправляемые и получаемые
|
||||
const int CREATE_OBJECT = 0x02; //znfo 8-| CREATE_OBJECT eq CREATE_PERMANENT_OBJECT
|
||||
const int CREATE_PERMANENT_OBJECT = 0x02;
|
||||
const int DELETE_OBJECT = 0x04;
|
||||
const int UPDATE_OBJECT = 0x08;
|
||||
const int HIDE_OBJECT = 0x0C;
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// Служебные отправляемые
|
||||
const int GAMES_LIST_QUERY = 0x81;
|
||||
const int TOP_LIST_QUERY = 0x82; // MP_game(1)
|
||||
|
||||
@@ -40,7 +40,7 @@ const int SET_PLAYER_DATA = 0x94; // PlayerData
|
||||
const int DIRECT_SENDING = 0x95; // Mask(4), SendData
|
||||
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// Служебные получаемые
|
||||
const int GAMES_LIST_RESPONSE = 0xC1; // Number(1),{ game_ID(1), game_Name(str) }
|
||||
const int TOP_LIST_RESPONSE = 0xC2; // MP_game(1), Number(1),{ Name(str), rating(float) }
|
||||
const int TOTAL_LIST_OF_PLAYERS_DATA = 0xCC; // Number(1),{ client_ID(1), BodySize(2) , Body, Name(str) }
|
||||
@@ -66,7 +66,7 @@ const int PLAYERS_RATING = 0xD4; // Client(1),rating(float), for me
|
||||
|
||||
|
||||
//zmod fixed
|
||||
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//модовые константы
|
||||
const int zSERVER_VERSION_RESPONSE = 0xE1; // version(4)
|
||||
const int zGAME_DATA_RESPONSE = 0xE2; // mod_id(4)
|
||||
const int zTIME_RESPONSE = 0xE3; // time(4)
|
||||
@@ -74,17 +74,17 @@ const int zTIME_RESPONSE = 0xE3; // time(4)
|
||||
const int zCREATE_OBJECT_BY_CLIENT = 0xE4; // GLOBAL_CLOCK(4),Type(1),ID(1),BodySize(1),Body(array)
|
||||
const int zCREATE_OBJECT_BY_SERVER = 0xE5; // NOT KNOWN YET
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>... <20><><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD>
|
||||
// кароче эти айди используются (или по крайней мере должны) только в трех... уже двух, вышеперечисленных евентах
|
||||
// а поэтому все на йух
|
||||
const int zOBJ_ID_DOLLY = 0x01;
|
||||
|
||||
/*****************************************************************
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
[<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - 1][station - 5][world - 4][<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - 6][counter - 16]
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
[1 - 10] - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
station = 00000 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 31 <20><><EFBFBD><EFBFBD><EFBFBD>, [1 - 31]
|
||||
Структура идентификатора объекта:
|
||||
[признак глобальности - 1][station - 5][world - 4][тип объекта - 6][counter - 16]
|
||||
первые восемь типов - личные вещи игрока
|
||||
[1 - 10] - автоматически удаляемые типы
|
||||
station = 00000 - объект, не имеющий создателя
|
||||
всего может быть 31 игрок, [1 - 31]
|
||||
*****************************************************************/
|
||||
const int MAX_NID_OBJECT = 15;
|
||||
|
||||
@@ -234,17 +234,17 @@ struct VanVarStatistic
|
||||
{
|
||||
int MaxLiveTime;//None
|
||||
int MinLiveTime;//None
|
||||
int KillFreq;//hh:mm:ss - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int DeathFreq;//hh:mm:ss - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int KillFreq;//hh:mm:ss - Средний период убийств
|
||||
int DeathFreq;//hh:mm:ss - Средний период смертей
|
||||
};
|
||||
|
||||
struct MechosomaStatistic
|
||||
{
|
||||
int ItemCount1,ItemCount2;
|
||||
int MaxTransitTime;//hh:mm:ss - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
int MaxTransitTime;//hh:mm:ss - Время окончания гонки
|
||||
int MinTransitTime;//None
|
||||
int SneakCount;//<EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int LostCount;//<EFBFBD><EFBFBD><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int SneakCount;//Кол-во украденного товара
|
||||
int LostCount;//Кол-во потерянного товара
|
||||
};
|
||||
|
||||
struct PassemblossStatistic
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
#include "sound/hsound.h"
|
||||
#endif
|
||||
|
||||
#include "xsocket.h"
|
||||
#ifndef _WIN32
|
||||
#include <arpa/inet.h> // ntohl() FIXME: remove
|
||||
#endif
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "xsocket.h"
|
||||
#include "multiplayer.h"
|
||||
|
||||
#define BROADCAST_PORT 1992
|
||||
#define DEFAULT_SERVER_PORT 2197
|
||||
|
||||
extern double zMod_cycle;
|
||||
|
||||
257
src/xsocket.cpp
257
src/xsocket.cpp
@@ -1,59 +1,51 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef _WINDOWS_
|
||||
#define WIN32_EXTRA_LEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <winsock.h>
|
||||
# define WIN32_EXTRA_LEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
# include <winsock.h>
|
||||
#else
|
||||
#include <unistd.h> // gethostname()
|
||||
#include <limits.h> // HOST_NAME_MAX
|
||||
#ifdef __HAIKU__
|
||||
#include <posix/sys/select.h> // fd_set
|
||||
#endif
|
||||
#ifndef _WIN32
|
||||
#include <arpa/inet.h> // ntohl() FIXME: remove
|
||||
#endif
|
||||
# include <limits.h> // HOST_NAME_MAX
|
||||
# include <unistd.h> // gethostname()
|
||||
# ifdef __HAIKU__
|
||||
# include <posix/sys/select.h> // fd_set
|
||||
# endif
|
||||
# ifndef _WIN32
|
||||
# include <arpa/inet.h> // ntohl() FIXME: remove
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include "xsocket.h"
|
||||
#define KDWIN
|
||||
#include "global.h"
|
||||
|
||||
#define XSOCKET_ERROR(str, code) do { \
|
||||
if (ErrHUsed) { \
|
||||
std::cout<<str<<": "<<code<<"\n"; \
|
||||
} else { \
|
||||
XSocketLastErrorString = (char *)str; \
|
||||
XSocketLastErrorCode = (char *)code; \
|
||||
} \
|
||||
} while(0)
|
||||
#define XSOCKET_ERROR(str, code) \
|
||||
do { \
|
||||
if (ErrHUsed) { \
|
||||
std::cout << str << ": " << code << "\n"; \
|
||||
} else { \
|
||||
XSocketLastErrorString = (char *)str; \
|
||||
XSocketLastErrorCode = (char *)code; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
// HOST_NAME_MAX is deprecated; use conservative value
|
||||
#ifndef HOST_NAME_MAX
|
||||
#define HOST_NAME_MAX 255
|
||||
# define HOST_NAME_MAX 255
|
||||
#endif
|
||||
|
||||
static char* XSocketLastErrorString = 0;
|
||||
static char* XSocketLastErrorCode = 0;
|
||||
static char *XSocketLastErrorString = 0;
|
||||
static char *XSocketLastErrorCode = 0;
|
||||
IPaddress XSocketLocalHostADDR;
|
||||
IPaddress XSocketLocalHostExternADDR;
|
||||
// HOST_NAME_MAX is POSIX.1-2001
|
||||
static char XSocketLocalHostName[HOST_NAME_MAX+1];
|
||||
|
||||
/*****************************************************************
|
||||
Initialization
|
||||
*****************************************************************/
|
||||
static char XSocketLocalHostName[HOST_NAME_MAX + 1];
|
||||
|
||||
int XSocketInit(int ErrHUsed) {
|
||||
static int XSocketInitializationOK = 0;
|
||||
|
||||
if(XSocketInitializationOK)
|
||||
if (XSocketInitializationOK)
|
||||
return 1;
|
||||
|
||||
// SDL_Init() should have already been called before this.
|
||||
@@ -80,10 +72,6 @@ int XSocketInit(int ErrHUsed) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
Constructor
|
||||
*****************************************************************/
|
||||
|
||||
XSocket::XSocket() {
|
||||
tcpSock = INVALID_SOCKET;
|
||||
ErrHUsed = 1;
|
||||
@@ -93,11 +81,11 @@ XSocket::XSocket() {
|
||||
}
|
||||
|
||||
XSocket::~XSocket() {
|
||||
if(tcpSock != INVALID_SOCKET)
|
||||
if (tcpSock != INVALID_SOCKET)
|
||||
close();
|
||||
}
|
||||
|
||||
XSocket::XSocket(XSocket& donor) {
|
||||
XSocket::XSocket(XSocket &donor) {
|
||||
tcpSock = donor.tcpSock;
|
||||
ErrHUsed = donor.ErrHUsed;
|
||||
addr = donor.addr;
|
||||
@@ -105,7 +93,7 @@ XSocket::XSocket(XSocket& donor) {
|
||||
socketSet = NULL;
|
||||
}
|
||||
|
||||
XSocket& XSocket::operator = (XSocket& donor) {
|
||||
XSocket &XSocket::operator=(XSocket &donor) {
|
||||
tcpSock = donor.tcpSock;
|
||||
ErrHUsed = donor.ErrHUsed;
|
||||
addr = donor.addr;
|
||||
@@ -115,10 +103,6 @@ XSocket& XSocket::operator = (XSocket& donor) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
Connect functions
|
||||
*****************************************************************/
|
||||
|
||||
int XSocket::tcp_open() {
|
||||
tcpSock = SDLNet_TCP_Open(&addr);
|
||||
|
||||
@@ -141,12 +125,9 @@ int XSocket::open(int IP, int port) {
|
||||
return tcp_open();
|
||||
}
|
||||
|
||||
int XSocket::open(char* name,int port) {
|
||||
#if _SERVER // FIXME: check actual define name
|
||||
if (!name) ErrH.Exit();
|
||||
#else
|
||||
if (!name) ErrH.Abort("NULL inet_addr() argument...");
|
||||
#endif
|
||||
int XSocket::open(char *name, int port) {
|
||||
if (!name)
|
||||
ErrH.Abort("NULL inet_addr() argument...");
|
||||
|
||||
if (SDLNet_ResolveHost(&addr, name, port) == -1) {
|
||||
XSOCKET_ERROR("TCP socket hostname resolution failed", SDLNet_GetError());
|
||||
@@ -156,15 +137,10 @@ int XSocket::open(char* name,int port) {
|
||||
return tcp_open();
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
UDP connection function
|
||||
*****************************************************************/
|
||||
|
||||
void XSocket::close() {
|
||||
if (tcpSock) {
|
||||
SDLNet_TCP_Close(tcpSock);
|
||||
tcpSock = INVALID_SOCKET;
|
||||
|
||||
}
|
||||
if (socketSet) {
|
||||
SDLNet_FreeSocketSet(socketSet);
|
||||
@@ -174,10 +150,6 @@ void XSocket::close() {
|
||||
addr.port = 0;
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
Listen - Accept functions
|
||||
*****************************************************************/
|
||||
|
||||
int XSocket::listen(int port) {
|
||||
addr.host = INADDR_ANY;
|
||||
addr.port = htons(port);
|
||||
@@ -192,172 +164,59 @@ int XSocket::listen(int port) {
|
||||
}
|
||||
|
||||
XSocket XSocket::accept() {
|
||||
XSocket xsock;
|
||||
TCPsocket newSock;
|
||||
|
||||
newSock = SDLNet_TCP_Accept(tcpSock);
|
||||
if (!newSock) {
|
||||
XSOCKET_ERROR("TCP accept failed", SDLNet_GetError());
|
||||
// TODO: check possible error conditions and results
|
||||
SDL_Delay(100);
|
||||
}
|
||||
if (!newSock) // TODO: Should emit error here
|
||||
return xsock;
|
||||
|
||||
XSocket xsock;
|
||||
xsock.tcpSock = newSock;
|
||||
xsock.ErrHUsed = ErrHUsed;
|
||||
xsock.addr.port = addr.port;
|
||||
xsock.socketSet = SDLNet_AllocSocketSet(16);
|
||||
SDLNet_TCP_AddSocket(xsock.socketSet, newSock);
|
||||
|
||||
return xsock;
|
||||
}
|
||||
|
||||
// TODO
|
||||
int XSocket::set_nonblocking_mode(int enable_nonblocking) {
|
||||
/* unsigned long arg = enable_nonblocking;
|
||||
if(ioctlsocket(sock,FIONBIO,&arg)){
|
||||
XSOCKET_ERROR("ioctlsocket() failed",SDLNet_GetError());
|
||||
int XSocket::send(const char *buffer, int size) {
|
||||
if (!tcpSock)
|
||||
return 0;
|
||||
}*/
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
Send and Receive functions
|
||||
*****************************************************************/
|
||||
|
||||
int XSocket::send(const char* buffer, int size) {
|
||||
int status = 0;
|
||||
if (tcpSock) {
|
||||
status = SDLNet_TCP_Send(tcpSock, buffer, size);
|
||||
if (status < size) {
|
||||
XSOCKET_ERROR("TCP send failed", SDLNet_GetError());
|
||||
// TODO: close socket?
|
||||
return 0;
|
||||
}
|
||||
return status;
|
||||
} else {
|
||||
int status = SDLNet_TCP_Send(tcpSock, buffer, size);
|
||||
if (status < size) {
|
||||
XSOCKET_ERROR("TCP send failed", SDLNet_GetError()); // TODO: close socket?
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return status;
|
||||
}
|
||||
|
||||
int XSocket::receive(char* buffer, int size_of_buffer, int ms_time) {
|
||||
int status = 0;
|
||||
|
||||
int XSocket::receive(char *buffer, int size_of_buffer, int ms_time) {
|
||||
if (ms_time == 0) {
|
||||
int numready;
|
||||
int n;
|
||||
|
||||
numready = SDLNet_CheckSockets(socketSet, 0);
|
||||
if(numready==-1) {
|
||||
n = SDLNet_CheckSockets(socketSet, 0);
|
||||
if (n == -1) {
|
||||
printf("SDLNet_CheckSockets: %s\n", SDLNet_GetError());
|
||||
//most of the time this is a system error, where perror might help you.
|
||||
// most of the time this is a system error, where perror might help you.
|
||||
perror("SDLNet_CheckSockets");
|
||||
} else if (numready == 0) {
|
||||
} else if (n == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!SDLNet_SocketReady(tcpSock)) {
|
||||
if (!SDLNet_SocketReady(tcpSock)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (tcpSock) {
|
||||
status = SDLNet_TCP_Recv(tcpSock, buffer, size_of_buffer);
|
||||
if (status <= 0)
|
||||
{
|
||||
XSOCKET_ERROR("TCP recv failed", SDLNet_GetError());
|
||||
return 0;
|
||||
}
|
||||
return status;
|
||||
if (!tcpSock)
|
||||
return 0;
|
||||
|
||||
} else {
|
||||
int status = SDLNet_TCP_Recv(tcpSock, buffer, size_of_buffer);
|
||||
if (status <= 0) {
|
||||
close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
Select functions
|
||||
*****************************************************************/
|
||||
|
||||
// TODO: MODIFY
|
||||
int XSocket::check_readability(int ms_time)
|
||||
{
|
||||
// return SDLNet_SocketReady(tcpSock);
|
||||
return 1;
|
||||
/* if(sock == INVALID_SOCKET)
|
||||
return 0;
|
||||
int val;
|
||||
FD_ZERO(&XSocketSet);
|
||||
FD_SET(sock,&XSocketSet);
|
||||
timeval timeout = { ms_time/1000, ms_time % 1000 };
|
||||
if((val = select(0, &XSocketSet, 0, 0, &timeout)) == SOCKET_ERROR){
|
||||
XSOCKET_ERROR("select() failed",SDLNet_GetError());
|
||||
return 0;
|
||||
}
|
||||
return val;*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
// TODO: MODIFY
|
||||
int XSocket::check_writeability(int ms_time)
|
||||
{
|
||||
/* if(sock == INVALID_SOCKET)
|
||||
return 0;
|
||||
int val;
|
||||
FD_ZERO(&XSocketSet);
|
||||
FD_SET(sock,&XSocketSet);
|
||||
timeval timeout = { ms_time/1000, ms_time % 1000 };
|
||||
if((val = select(0, 0, &XSocketSet, 0, &timeout)) == SOCKET_ERROR){
|
||||
XSOCKET_ERROR("select() failed",SDLNet_GetError());
|
||||
return 0;
|
||||
}
|
||||
return val;*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
Send To and Receive From functions
|
||||
*****************************************************************/
|
||||
// DO NOT USE?
|
||||
int XSocket::sendto(const char* buffer, int size, unsigned int IP)
|
||||
{
|
||||
/* SOCKADDR_IN addr;
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_addr.s_addr = IP;
|
||||
addr.sin_port = htons(port);
|
||||
int status = ::sendto(sock, buffer, size, 0, (LPSOCKADDR)&addr, sizeof(SOCKADDR_IN));
|
||||
if(status == SOCKET_ERROR){
|
||||
int err_code;
|
||||
if((err_code = SDLNet_GetError()) == WSAEWOULDBLOCK)
|
||||
return 0;
|
||||
// XSOCKET_ERROR("sendto() failed",err_code);
|
||||
sock = INVALID_SOCKET;
|
||||
return 0;
|
||||
}
|
||||
return status;*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
// DO NOT USE
|
||||
int XSocket::receivefrom(char* buffer, int size_of_buffer, int ms_time)
|
||||
{
|
||||
/* int status = 0;
|
||||
if(check_readability(ms_time)){
|
||||
status = recvfrom(sock, buffer, size_of_buffer, 0,0,0);
|
||||
if(status == SOCKET_ERROR){
|
||||
XSOCKET_ERROR("recvfrom() failed",SDLNet_GetError());
|
||||
sock = INVALID_SOCKET;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return status;*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
// WTF?
|
||||
char* get_name_by_addr(int IP)
|
||||
{
|
||||
IPaddress addr;
|
||||
addr.host = htonl(IP);
|
||||
return (char *)SDLNet_ResolveIP(&addr); // TODO: erm, check if code that calls this function does anything nasty to the returned buffer...
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -1,25 +1,19 @@
|
||||
#ifndef _XSOCKET_H
|
||||
#define _XSOCKET_H
|
||||
|
||||
#include "global.h"
|
||||
#include "xglobal.h"
|
||||
#include "SDL_net.h"
|
||||
|
||||
#include "xcontainers.h"
|
||||
|
||||
int XSocketInit(int ErrHUsed = 1);
|
||||
int XSocketGetErrorStatus();
|
||||
char* XSocketGetLastError();
|
||||
|
||||
// extern char XSocketLocalHostName[257];
|
||||
extern IPaddress XSocketLocalHostADDR; // used in network.cpp
|
||||
extern IPaddress XSocketLocalHostExternADDR; // used in iscreen/iscr_fnc.cpp
|
||||
// extern int XSocketInitializationOK;
|
||||
|
||||
char* get_name_by_addr(int IP);
|
||||
|
||||
#define INVALID_SOCKET NULL
|
||||
#define SOCKET_ERROR (-1)
|
||||
#define SEND_BROADCAST (unsigned int)0xffffffff
|
||||
|
||||
#define XS_WAITING_TIME 120000
|
||||
|
||||
class XSocket
|
||||
{
|
||||
@@ -37,27 +31,14 @@ class XSocket
|
||||
|
||||
int open(int IP,int port);
|
||||
int open(char* name,int port);
|
||||
|
||||
// socks4/5 operation is allowed by using FreeCap or tsocks wrappers.
|
||||
// int open_by_socks5(char* name,int port,char* proxy_name,int proxy_port = 1080);
|
||||
|
||||
void close();
|
||||
|
||||
int listen(int port);
|
||||
XSocket accept();
|
||||
|
||||
void set_ErrHUsing(int enable_using);
|
||||
int set_nonblocking_mode(int enable_nonblocking);
|
||||
|
||||
int check_readability(int ms_time = 0);
|
||||
int check_writeability(int ms_time = 0);
|
||||
|
||||
int send(const char* buffer, int size);
|
||||
int receive(char* buffer, int size_of_buffer, int ms_time = 0);
|
||||
|
||||
int sendto(const char* buffer, int size, unsigned int IP = SEND_BROADCAST);
|
||||
int receivefrom(char* buffer, int size_of_buffer, int ms_time = 0);
|
||||
|
||||
int operator! (){ return tcpSock == INVALID_SOCKET; }
|
||||
int operator() (){ return tcpSock != INVALID_SOCKET; }
|
||||
|
||||
@@ -65,7 +46,4 @@ class XSocket
|
||||
int tcp_open();
|
||||
};
|
||||
|
||||
// For some reason, container classes were defined in xsocket include in original V.
|
||||
#include "xcontainers.h"
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user