network.c
author tron
Wed, 24 Nov 2004 22:52:57 +0000
changeset 504 b98cf0639775
parent 425 a8a07a6fbe1c
child 507 8aa8100b0b22
permissions -rw-r--r--
(svn r803) Switch to ISO 8859-15
It has proper support for the euro sign and includes letters which are needed by the Latvian translation (and perhaps others), though the letter sprites are missing.
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     1
#include "stdafx.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     2
#include "ttd.h"
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
     3
#include "gui.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     4
#include "command.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
#include "player.h"
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
     6
#include "console.h"
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
     7
#include "economy.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     8
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     9
#if defined(WIN32)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    10
#	include <windows.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    11
#	include <winsock.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    12
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    13
# pragma comment (lib, "ws2_32.lib")
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    14
# define ENABLE_NETWORK
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    15
# define GET_LAST_ERROR() WSAGetLastError()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    16
# define EWOULDBLOCK WSAEWOULDBLOCK
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    17
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    18
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    19
#if defined(UNIX)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    20
// Make compatible with WIN32 names
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    21
#	define SOCKET int
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    22
#	define INVALID_SOCKET -1
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    23
// we need different defines for MorphOS and AmigaOS
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    24
#if !defined(__MORPHOS__) && !defined(__AMIGA__)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    25
#	define ioctlsocket ioctl
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    26
# define closesocket close
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    27
# define GET_LAST_ERROR() errno
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    28
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    29
// Need this for FIONREAD on solaris
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    30
#	define BSD_COMP
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    31
#	include <unistd.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    32
#	include <sys/ioctl.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    33
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    34
// Socket stuff
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    35
#	include <sys/socket.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    36
#	include <netinet/in.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    37
#	include <arpa/inet.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    38
# 	include <errno.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    39
# 	include <sys/time.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    40
// NetDB
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    41
#   include <netdb.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    42
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    43
# ifndef TCP_NODELAY
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    44
#  define TCP_NODELAY 0x0001
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    45
# endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    46
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    47
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    48
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    49
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    50
#if defined(__MORPHOS__) || defined(__AMIGA__)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    51
#	include <exec/types.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    52
#	include <proto/exec.h> 		// required for Open/CloseLibrary()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    53
#	if defined(__MORPHOS__)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    54
#		include <sys/filio.h> 	// FION#? defines
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    55
#	else // __AMIGA__
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    56
#		include	<proto/socket.h>
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    57
#	endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    58
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    59
// make source compatible with bsdsocket.library functions
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    60
# define closesocket(s)     						CloseSocket(s)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    61
# define GET_LAST_ERROR() 							Errno()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    62
#	define ioctlsocket(s,request,status)  IoctlSocket((LONG)s,(ULONG)request,(char*)status)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    63
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    64
struct Library *SocketBase = NULL;
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    65
173
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
    66
#if !defined(__MORPHOS__)
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    67
// usleep() implementation
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    68
#include <devices/timer.h>
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    69
#include <dos/dos.h>
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    70
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    71
struct Device       *TimerBase    = NULL;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    72
struct MsgPort      *TimerPort    = NULL;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    73
struct timerequest  *TimerRequest = NULL;
173
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
    74
#endif
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    75
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    76
#endif /* __MORPHOS__ || __AMIGA__ */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    77
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    78
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    79
#define SEND_MTU 1460
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    80
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    81
#if defined(ENABLE_NETWORK)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    82
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    83
enum {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    84
	PACKET_TYPE_WELCOME = 0,
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    85
	PACKET_TYPE_READY,
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    86
	PACKET_TYPE_ACK,
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    87
	PACKET_TYPE_SYNC,
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
    88
	PACKET_TYPE_FSYNC,
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    89
	PACKET_TYPE_XMIT,
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    90
	PACKET_TYPE_COMMAND,
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
    91
	PACKET_TYPE_EVENT,
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    92
};
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
    93
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    94
// sent from client -> server whenever the client wants to exec a command.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    95
// send from server -> client when another player execs a command.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    96
typedef struct CommandPacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    97
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    98
	byte packet_type;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    99
	uint16 cmd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   100
	uint32 p1,p2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   101
	TileIndex tile;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   102
	byte player;// player id, this is checked by the server.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   103
	byte when;  // offset from the current max_frame value minus 1. this is set by the server.
281
57f126a1e4b5 (svn r287) Sorry, another mistake
dominik
parents: 280
diff changeset
   104
	uint32 dp[8];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   105
} CommandPacket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   106
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   107
typedef struct EventPacket {
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   108
	byte packet_length;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   109
	byte packet_type;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   110
	byte event_type;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   111
	byte data_start;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   112
} EventPacket;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   113
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   114
#define COMMAND_PACKET_BASE_SIZE (sizeof(CommandPacket) - 8 * sizeof(uint32))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   115
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   116
// sent from server -> client periodically to tell the client about the current tick in the server
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   117
// and how far the client may progress.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   118
typedef struct SyncPacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   119
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   120
	byte packet_type;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   121
	byte frames; // how many more frames may the client execute? this is relative to the old value of max.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   122
	byte server; // where is the server currently executing? this is negatively relative to the old value of max.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   123
	uint32 random_seed_1; // current random state at server. used to detect out of sync.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   124
	uint32 random_seed_2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   125
} SyncPacket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   126
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   127
typedef struct FrameSyncPacket {
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   128
	byte packet_length;
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   129
	byte packet_type;
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   130
	byte frames; // where is the server currently executing? this is negatively relative to the old value of max.
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   131
} FrameSyncPacket;
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   132
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   133
// sent from server -> client as an acknowledgement that the server received the command.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   134
// the command will be executed at the current value of "max".
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   135
typedef struct AckPacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   136
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   137
	byte packet_type;
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   138
	int16 when;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   139
} AckPacket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   140
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   141
typedef struct ReadyPacket {
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   142
	byte packet_length;
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   143
	byte packet_type;
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   144
} ReadyPacket;
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   145
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   146
typedef struct FilePacketHdr {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   147
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   148
	byte packet_type;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   149
} FilePacketHdr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   150
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   151
// sent from server to client when the client has joined.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   152
typedef struct WelcomePacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   153
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   154
	byte packet_type;
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   155
	uint32 player_seeds[MAX_PLAYERS][2];
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   156
	uint32 frames_max;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   157
	uint32 frames_srv;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   158
	uint32 frames_cnt;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   159
} WelcomePacket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   160
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   161
typedef struct Packet Packet;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   162
struct Packet {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   163
	Packet *next; // this one has to be the first element.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   164
	uint siz;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   165
	byte buf[SEND_MTU]; // packet payload
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   166
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   167
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   168
typedef struct ClientState {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   169
	int socket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   170
	bool inactive; // disable sending of commands/syncs to client
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   171
	bool writable;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   172
	bool ready;
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   173
	uint timeout;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   174
	uint xmitpos;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   175
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   176
	uint eaten;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   177
	Packet *head, **last;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   178
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   179
	uint buflen;											// receive buffer len
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   180
	byte buf[1024];										// receive buffer
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   181
} ClientState;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   182
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   183
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   184
typedef struct QueuedCommand QueuedCommand;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   185
struct QueuedCommand {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   186
	QueuedCommand *next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   187
	CommandPacket cp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   188
	CommandCallback *callback;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   189
	uint32 cmd;
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   190
	uint32 frame;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   191
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   192
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   193
typedef struct CommandQueue CommandQueue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   194
struct CommandQueue {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   195
	QueuedCommand *head, **last;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   196
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   197
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   198
#define MAX_CLIENTS (MAX_PLAYERS + 1)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   199
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   200
// packets waiting to be executed, for each of the players.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   201
// this list is sorted in frame order, so the item on the front will be executed first.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   202
static CommandQueue _command_queue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   203
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   204
// in the client, this is the list of commands that have not yet been acked.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   205
// when it is acked, it will be moved to the appropriate position at the end of the player queue.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   206
static CommandQueue _ack_queue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   207
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   208
static ClientState _clients[MAX_CLIENTS];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   209
static int _num_clients;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   210
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   211
// keep a history of the 16 most recent seeds to be able to capture out of sync errors.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   212
static uint32 _my_seed_list[16][2];
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   213
static bool _network_ready_sent;
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   214
static uint32 _frame_fsync_last;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   215
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   216
typedef struct FutureSeeds {
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   217
	uint32 frame;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   218
	uint32 seed[2];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   219
} FutureSeeds;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   220
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   221
// remember some future seeds that the server sent to us.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   222
static FutureSeeds _future_seed[8];
175
d6cccece959a (svn r176) -Fix: network_gui const and warnings fixes (Tron)
darkvater
parents: 173
diff changeset
   223
static uint _num_future_seed;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   224
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   225
static SOCKET _listensocket; // tcp socket
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   226
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   227
static SOCKET _udp_client_socket; // udp server socket
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   228
static SOCKET _udp_server_socket; // udp client socket
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   229
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   230
typedef struct UDPPacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   231
	byte command_code;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   232
	byte data_len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   233
	byte command_check;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   234
	byte data[255];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   235
} UDPPacket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   236
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   237
enum {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   238
	NET_UDPCMD_SERVERSEARCH = 1,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   239
	NET_UDPCMD_SERVERACTIVE,
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   240
	NET_UDPCMD_GETSERVERINFO,
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   241
	NET_UDPCMD_SERVERINFO,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   242
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   243
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   244
void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet);
213
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   245
static void HandleCommandPacket(ClientState *cs, CommandPacket *np);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   246
static void CloseClient(ClientState *cs);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   247
void NetworkSendWelcome(ClientState *cs, bool direct);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   248
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   249
uint32 _network_ip_list[10]; // network ip list
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   250
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   251
// this is set to point to the savegame
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   252
static byte *_transmit_file;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   253
static size_t _transmit_file_size;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   254
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   255
static FILE *_recv_file;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   256
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   257
/* multi os compatible sleep function */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   258
void CSleep(int milliseconds) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   259
#if defined(WIN32)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   260
Sleep(milliseconds);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   261
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   262
#if defined(UNIX)
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
   263
#if !defined(__BEOS__) && !defined(__MORPHOS__) && !defined(__AMIGAOS__)
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   264
usleep(milliseconds*1000);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   265
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   266
#ifdef __BEOS__
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   267
snooze(milliseconds*1000);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   268
#endif
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
   269
#if defined(__MORPHOS__)
173
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
   270
usleep(milliseconds*1000);
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
   271
#endif
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
   272
#if defined(__AMIGAOS__) && !defined(__MORPHOS__)
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
   273
{
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   274
	ULONG signals;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   275
	ULONG TimerSigBit = 1 << TimerPort->mp_SigBit;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   276
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   277
	// send IORequest
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   278
	TimerRequest->tr_node.io_Command = TR_ADDREQUEST;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   279
	TimerRequest->tr_time.tv_secs    = (milliseconds * 1000) / 1000000;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   280
	TimerRequest->tr_time.tv_micro   = (milliseconds * 1000) % 1000000;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   281
	SendIO((struct IORequest *)TimerRequest);
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   282
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   283
	if ( !((signals = Wait(TimerSigBit|SIGBREAKF_CTRL_C)) & TimerSigBit) ) {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   284
		AbortIO((struct IORequest *)TimerRequest);
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   285
	}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   286
	WaitIO((struct IORequest *)TimerRequest);
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   287
}
173
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
   288
#endif // __AMIGAOS__ && !__MORPHOS__
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   289
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   290
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   291
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   292
//////////////////////////////////////////////////////////////////////
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   293
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   294
// ****************************** //
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   295
// * Network Error Handlers     * //
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   296
// ****************************** //
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   297
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   298
static void NetworkHandleSaveGameError()
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   299
{
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   300
		_networking_sync = false;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   301
		_networking_queuing = true;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   302
		_switch_mode = SM_MENU;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   303
		_switch_mode_errorstr = STR_NETWORK_ERR_SAVEGAMEERROR;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   304
}
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   305
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   306
static void NetworkHandleConnectionLost()
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   307
{
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   308
		_networking_sync = false;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   309
		_networking_queuing = true;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   310
		_switch_mode = SM_MENU;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   311
		_switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   312
}
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
   313
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   314
static void NetworkHandleDeSync()
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   315
{
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   316
	DEBUG(net, 0) ("NET: error: network sync error at frame %i", _frame_counter);
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   317
	{
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   318
		int i;
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   319
		for (i=15; i>=0; i--) DEBUG(net,0) ("NET frame %i: [0]=%i, [1]=%i",_frame_counter-(i+1),_my_seed_list[i][0],_my_seed_list[i][1]);
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   320
		for (i=0; i<8; i++) DEBUG(net,0) ("NET frame %i: [0]=%i, [1]=%i",_frame_counter+i,_future_seed[i].seed[0],_future_seed[i].seed[1]);
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   321
	}
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   322
	_networking_sync = false;
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   323
	_networking_queuing = true;
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   324
	_switch_mode = SM_MENU;
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   325
	_switch_mode_errorstr = STR_NETWORK_ERR_DESYNC;
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   326
}
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   327
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   328
// ****************************** //
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   329
// * TCP Packets and Handlers   * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   330
// ****************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   331
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   332
static QueuedCommand *AllocQueuedCommand(CommandQueue *nq)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   333
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   334
	QueuedCommand *qp = (QueuedCommand*)calloc(sizeof(QueuedCommand), 1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   335
	assert(qp);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   336
	*nq->last = qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   337
	nq->last = &qp->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   338
	return qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   339
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   340
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
   341
static void QueueClear(CommandQueue *nq)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
   342
{
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   343
	QueuedCommand *qp;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   344
	while ((qp=nq->head)) {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   345
		// unlink it.
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   346
		if (!(nq->head = qp->next)) nq->last = &nq->head;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   347
		free(qp);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   348
		}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   349
	nq->last = &nq->head;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   350
}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   351
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   352
static int GetNextSyncFrame()
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   353
{
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   354
	uint32 newframe;
262
3076b77dce21 (svn r268) -Fix: console-command: script command now stops recording correctly
signde
parents: 260
diff changeset
   355
	if (_frame_fsync_last == 0) return -11;
3076b77dce21 (svn r268) -Fix: console-command: script command now stops recording correctly
signde
parents: 260
diff changeset
   356
	newframe = (_frame_fsync_last + 11); // do not use a multiple of 4 since that screws up sync-packets
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   357
	return (_frame_counter_max - newframe);
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   358
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   359
}
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   360
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   361
// go through the player queues for each player and see if there are any pending commands
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   362
// that should be executed this frame. if there are, execute them.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   363
void NetworkProcessCommands()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   364
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   365
	CommandQueue *nq;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   366
	QueuedCommand *qp;
260
32fcaaf9f4ef (svn r266) -Fix: hopefully fixed the desync problem nicely (and reverted the
truelight
parents: 256
diff changeset
   367
	byte old_player;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   368
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   369
	// queue mode ?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   370
	if (_networking_queuing)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   371
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   372
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   373
	nq = &_command_queue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   374
	while ( (qp=nq->head) && (!_networking_sync || qp->frame <= _frame_counter)) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   375
		// unlink it.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   376
		if (!(nq->head = qp->next)) nq->last = &nq->head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   377
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   378
		if (qp->frame < _frame_counter && _networking_sync) {
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   379
			DEBUG(net,0) ("warning: !qp->cp.frame < _frame_counter, %d < %d [%d]\n", qp->frame, _frame_counter, _frame_counter_srv+4);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   380
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   381
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   382
		// run the command
260
32fcaaf9f4ef (svn r266) -Fix: hopefully fixed the desync problem nicely (and reverted the
truelight
parents: 256
diff changeset
   383
		old_player = _current_player;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   384
		_current_player = qp->cp.player;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   385
		memcpy(_decode_parameters, qp->cp.dp, (qp->cp.packet_length - COMMAND_PACKET_BASE_SIZE));
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   386
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   387
		DoCommandP(qp->cp.tile, qp->cp.p1, qp->cp.p2, qp->callback, qp->cmd | CMD_DONT_NETWORK);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   388
		free(qp);
260
32fcaaf9f4ef (svn r266) -Fix: hopefully fixed the desync problem nicely (and reverted the
truelight
parents: 256
diff changeset
   389
		_current_player = old_player;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   390
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   391
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   392
	if (!_networking_server) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   393
		// remember the random seed so we can check if we're out of sync.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   394
		_my_seed_list[_frame_counter & 15][0] = _sync_seed_1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   395
		_my_seed_list[_frame_counter & 15][1] = _sync_seed_2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   396
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   397
		while (_num_future_seed) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   398
			assert(_future_seed[0].frame >= _frame_counter);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   399
			if (_future_seed[0].frame != _frame_counter) break;
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   400
			if (_future_seed[0].seed[0] != _sync_seed_1 ||_future_seed[0].seed[1] != _sync_seed_2) NetworkHandleDeSync();
425
a8a07a6fbe1c (svn r624) Merge r377 to trunk:
tron
parents: 288
diff changeset
   401
			memmove(_future_seed, _future_seed + 1, --_num_future_seed * sizeof(FutureSeeds));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   402
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   403
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   404
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   405
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   406
// send a packet to a client
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   407
static void SendBytes(ClientState *cs, void *bytes, uint len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   408
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   409
	byte *b = (byte*)bytes;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   410
	uint n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   411
	Packet *p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   412
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   413
	assert(len != 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   414
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   415
	// see if there's space in the last packet?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   416
	if (!cs->head || (p = (Packet*)cs->last, p->siz == sizeof(p->buf)))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   417
		p = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   418
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   419
	do {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   420
		if (!p) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   421
			// need to allocate a new packet buffer.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   422
			p = (Packet*)malloc(sizeof(Packet));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   423
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   424
			// insert at the end of the linked list.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   425
			*cs->last = p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   426
			cs->last = &p->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   427
			p->next = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   428
			p->siz = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   429
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   430
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   431
		// copy bytes to packet.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   432
		n = minu(sizeof(p->buf) - p->siz, len);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   433
		memcpy(p->buf + p->siz, b, n);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   434
		p->siz += n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   435
		b += n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   436
		p = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   437
	} while (len -= n);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   438
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   439
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   440
// send data direct to a client
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   441
static void SendDirectBytes(ClientState *cs, void *bytes, uint len)
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   442
{
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   443
	char *buf = (char*)bytes;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   444
	uint n;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   445
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   446
	n = send(cs->socket, buf, len, 0);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   447
	if (n == -1) {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   448
				int err = GET_LAST_ERROR();
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   449
				DEBUG(net, 0) ("NET: %i] send() failed with error %d", _frame_counter, err);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   450
				CloseClient(cs);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   451
			}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   452
}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   453
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   454
// client:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   455
//   add it to the client's ack queue, and send the command to the server
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   456
// server:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   457
//   add it to the server's player queue, and send it to all clients.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   458
void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   459
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   460
	int nump;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   461
	QueuedCommand *qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   462
	ClientState *cs;
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   463
	CommandPacket cp;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   464
213
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   465
	if (!(cmd & CMD_NET_INSTANT)) {
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   466
		qp = AllocQueuedCommand(_networking_server ? &_command_queue : &_ack_queue);
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   467
	} else {
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   468
		qp = (QueuedCommand*)calloc(sizeof(QueuedCommand), 1);
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   469
		}
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   470
	qp->cp.packet_type = PACKET_TYPE_COMMAND;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   471
	qp->cp.tile = tile;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   472
	qp->cp.p1 = p1;
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   473
	qp->cp.p2 = p2;	
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   474
	qp->cp.cmd = (uint16)cmd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   475
	qp->cp.player = _local_player;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   476
	qp->cp.when = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   477
	qp->cmd = cmd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   478
	qp->callback = callback;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   479
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   480
	// so the server knows when to execute it.
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   481
	qp->frame = _frame_counter_max - GetNextSyncFrame();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   482
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   483
	// calculate the amount of extra bytes.
281
57f126a1e4b5 (svn r287) Sorry, another mistake
dominik
parents: 280
diff changeset
   484
	nump = 8;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   485
	while ( nump != 0 && ((uint32*)_decode_parameters)[nump-1] == 0) nump--;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   486
	qp->cp.packet_length = COMMAND_PACKET_BASE_SIZE + nump * sizeof(uint32);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   487
	if (nump != 0) memcpy(qp->cp.dp, _decode_parameters, nump * sizeof(uint32));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   488
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   489
	cp = qp->cp;
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   490
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   491
	// convert to little endian
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   492
	cp.tile = TO_LE16(cp.tile);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   493
	cp.p1 = TO_LE32(cp.p1);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   494
	cp.p2 = TO_LE32(cp.p2);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   495
	cp.cmd = TO_LE16(cp.cmd);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   496
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   497
	// send it to the peers
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   498
	for(cs=_clients; cs->socket != INVALID_SOCKET; cs++) if (!cs->inactive) SendBytes(cs, &cp, cp.packet_length);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   499
213
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   500
	if (cmd & CMD_NET_INSTANT) {
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   501
		free(qp);
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   502
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   503
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   504
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   505
void NetworkSendEvent(uint16 type, uint16 data_len, void * data)
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   506
{
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   507
	EventPacket * ep;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   508
	ClientState *cs;
260
32fcaaf9f4ef (svn r266) -Fix: hopefully fixed the desync problem nicely (and reverted the
truelight
parents: 256
diff changeset
   509
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   510
	// encode the event ... add its data
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   511
	ep=malloc(data_len+sizeof(EventPacket)-1);
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   512
	ep->event_type = type;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   513
	ep->packet_length = data_len+sizeof(EventPacket)-1;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   514
	ep->packet_type = PACKET_TYPE_EVENT;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   515
	memcpy(&ep->data_start,data,data_len);
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   516
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   517
	// send it to the peers
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   518
	for(cs=_clients; cs->socket != INVALID_SOCKET; cs++) if (!cs->inactive) SendBytes(cs, ep, ep->packet_length);
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   519
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   520
	// free the temp packet
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   521
	free(ep);
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   522
}
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   523
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   524
// client:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   525
//   server sends a command from another player that we should execute.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   526
//   put it in the command queue.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   527
//
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   528
// server:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   529
//   client sends a command that it wants to execute.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   530
//   fill the when field so the client knows when to execute it.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   531
//   put it in the appropriate player queue.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   532
//   send it to all other clients.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   533
//   send an ack packet to the actual client.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   534
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   535
static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   536
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   537
	QueuedCommand *qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   538
	ClientState *c;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   539
	AckPacket ap;
213
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   540
	uint16 cmd;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   541
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   542
	DEBUG(net, 2) ("NET: %i] cmd size %d", _frame_counter, np->packet_length);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   543
	assert(np->packet_length >= COMMAND_PACKET_BASE_SIZE);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   544
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   545
	cmd = FROM_LE16(np->cmd);
213
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   546
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   547
	if (!(cmd & CMD_NET_INSTANT)) {
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   548
		// put it into the command queue
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   549
		qp = AllocQueuedCommand(&_command_queue);
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   550
	} else {
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   551
		qp = (QueuedCommand*)calloc(sizeof(QueuedCommand), 1);
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   552
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   553
	qp->cp = *np;
222
b88456001397 (svn r223) -Fix: Const correctness and miscellaneous fixes. Thank you Tron for your diligent fixing of warnings (and some possibly bugs) (Tron)
darkvater
parents: 220
diff changeset
   554
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   555
	qp->frame = _frame_counter_max - GetNextSyncFrame();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   556
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   557
	qp->callback = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   558
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   559
	// extra params
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   560
	memcpy(&qp->cp.dp, np->dp, np->packet_length - COMMAND_PACKET_BASE_SIZE);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   561
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   562
	ap.packet_type = PACKET_TYPE_ACK;
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   563
	ap.when = TO_LE16(GetNextSyncFrame());
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   564
	ap.packet_length = sizeof(AckPacket);
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   565
	DEBUG(net,4)("NET: %i] NewACK: frame=%i %i",_frame_counter, ap.when,_frame_counter_max - GetNextSyncFrame());
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   566
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   567
	// send it to the peers
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   568
	if (_networking_server) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   569
		for(c=_clients; c->socket != INVALID_SOCKET; c++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   570
			if (c == cs) {
213
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   571
				if (!(cmd & CMD_NET_INSTANT)) SendDirectBytes(c, &ap, ap.packet_length);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   572
			} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   573
				if (!cs->inactive) SendBytes(c, &qp->cp, qp->cp.packet_length);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   574
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   575
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   576
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   577
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   578
// convert from little endian to big endian?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   579
#if defined(TTD_BIG_ENDIAN)
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   580
	qp->cp.cmd = FROM_LE16(qp->cp.cmd);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   581
	qp->cp.tile = FROM_LE16(qp->cp.tile);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   582
	qp->cp.p1 = FROM_LE32(qp->cp.p1);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   583
	qp->cp.p2 = FROM_LE32(qp->cp.p2);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   584
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   585
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   586
	qp->cmd = qp->cp.cmd;
213
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   587
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   588
	if (cmd & CMD_NET_INSTANT) {
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   589
		byte p = _current_player;
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   590
		_current_player = qp->cp.player;
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   591
		memcpy(_decode_parameters, qp->cp.dp, (qp->cp.packet_length - COMMAND_PACKET_BASE_SIZE));
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   592
		DoCommandP(qp->cp.tile, qp->cp.p1, qp->cp.p2, qp->callback, qp->cmd | CMD_DONT_NETWORK);
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   593
		free(qp);
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   594
		_current_player = p;
770e504a6e51 (svn r214) -Feature: CMD_NET_INSTANT [just in time command handling over network] (sign_de)
darkvater
parents: 211
diff changeset
   595
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   596
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   597
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   598
static void HandleEventPacket(EventPacket *ep)
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   599
{
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   600
	switch (ep->event_type) {
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   601
		case NET_EVENT_SUBSIDY:
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   602
			RemoteSubsidyAdd((Subsidy *)&ep->data_start);
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   603
			break;
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   604
	}
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   605
}
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   606
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   607
// sent from server -> client periodically to tell the client about the current tick in the server
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   608
// and how far the client may progress.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   609
static void HandleSyncPacket(SyncPacket *sp)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   610
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   611
	uint32 s1,s2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   612
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   613
	_frame_counter_srv = _frame_counter_max - sp->server;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   614
	_frame_counter_max += sp->frames;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   615
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   616
	// reset network ready packet state
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   617
	_network_ready_sent = false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   618
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   619
	// queueing only?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   620
	if (_networking_queuing || _frame_counter == 0)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   621
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   622
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   623
	s1 = FROM_LE32(sp->random_seed_1);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   624
	s2 = FROM_LE32(sp->random_seed_2);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   625
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   626
	DEBUG(net, 3) ("NET: %i] sync seeds: 1=%i 2=%i",_frame_counter, sp->random_seed_1, sp->random_seed_2);
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   627
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   628
	if (_frame_counter_srv <= _frame_counter) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   629
		// we are ahead of the server check if the seed is in our list.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   630
		if (_frame_counter_srv + 16 > _frame_counter) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   631
			// the random seed exists in our array check it.
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   632
			if (s1 != _my_seed_list[_frame_counter_srv & 0xF][0] || s2 != _my_seed_list[_frame_counter_srv & 0xF][1]) NetworkHandleDeSync();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   633
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   634
	} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   635
		// the server's frame has not been executed yet. store the server's seed in a list.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   636
		if (_num_future_seed < lengthof(_future_seed)) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   637
			_future_seed[_num_future_seed].frame = _frame_counter_srv;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   638
			_future_seed[_num_future_seed].seed[0] = s1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   639
			_future_seed[_num_future_seed].seed[1] = s2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   640
			_num_future_seed++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   641
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   642
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   643
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   644
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   645
static void HandleFSyncPacket(FrameSyncPacket *fsp)
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   646
{
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   647
	DEBUG(net,3)("NET: %i] FSYNC: srv=%i %i",_frame_counter, fsp->frames,(_frame_counter_max - fsp->frames));
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   648
	if (fsp->frames < 1) return;
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   649
	_frame_fsync_last = _frame_counter_srv = _frame_counter_max - fsp->frames;
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   650
}
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   651
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   652
// sent from server -> client as an acknowledgement that the server received the command.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   653
// the command will be executed at the current value of "max".
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   654
static void HandleAckPacket(AckPacket * ap)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   655
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   656
	QueuedCommand *q;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   657
	// move a packet from the ack queue to the end of this player's queue.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   658
	q = _ack_queue.head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   659
	assert(q);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   660
	if (!(_ack_queue.head = q->next)) _ack_queue.last = &_ack_queue.head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   661
	q->next = NULL;
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   662
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   663
	q->frame = (_frame_counter_max - (FROM_LE16(ap->when)));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   664
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   665
	*_command_queue.last = q;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   666
	_command_queue.last = &q->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   667
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   668
	DEBUG(net, 2) ("NET %i] ack [frame=%i]",_frame_counter,q->frame);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   669
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   670
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   671
static void HandleFilePacket(FilePacketHdr *fp)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   672
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   673
	int n = fp->packet_length - sizeof(FilePacketHdr);
280
3d5b25a5f11f (svn r286) Sorry, little memalloc problem
dominik
parents: 279
diff changeset
   674
	char tempfile[512];
3d5b25a5f11f (svn r286) Sorry, little memalloc problem
dominik
parents: 279
diff changeset
   675
3d5b25a5f11f (svn r286) Sorry, little memalloc problem
dominik
parents: 279
diff changeset
   676
	sprintf(tempfile, "%s/networkc.tmp",  _path.personal_dir);
279
1d2f6b676e9f (svn r285) Fix: networkc.tmp will be created in user's homedir (Loki|muh)
dominik
parents: 276
diff changeset
   677
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   678
	if (n == 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   679
		assert(_networking_queuing);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   680
		assert(!_networking_sync);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   681
		// eof
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   682
		if (_recv_file) { fclose(_recv_file); _recv_file = NULL; }
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   683
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   684
		// attempt loading the game.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   685
		_game_mode = GM_NORMAL;
279
1d2f6b676e9f (svn r285) Fix: networkc.tmp will be created in user's homedir (Loki|muh)
dominik
parents: 276
diff changeset
   686
		if (SaveOrLoad(tempfile, SL_LOAD) != SL_OK) {
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   687
				NetworkCoreDisconnect();
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   688
				NetworkHandleSaveGameError();
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   689
				return;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
   690
				}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   691
		// sync to server.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   692
		_networking_queuing = false;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   693
		NetworkStartSync(false);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   694
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   695
		if (_network_playas == 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   696
			// send a command to make a new player
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   697
			_local_player = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   698
			NetworkSendCommand(0, 0, 0, CMD_PLAYER_CTRL, NULL);
1
0ea1e0a5c4df (svn r2) -Fix [993829] UDP Fixes (lucaspiller)
darkvater
parents: 0
diff changeset
   699
			_local_player = OWNER_SPECTATOR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   700
		} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   701
			// take control over an existing company
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   702
			if (DEREF_PLAYER(_network_playas-1)->is_active)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   703
				_local_player = _network_playas-1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   704
			else
1
0ea1e0a5c4df (svn r2) -Fix [993829] UDP Fixes (lucaspiller)
darkvater
parents: 0
diff changeset
   705
				_local_player = OWNER_SPECTATOR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   706
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   707
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   708
	} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   709
		if(!_recv_file) {
279
1d2f6b676e9f (svn r285) Fix: networkc.tmp will be created in user's homedir (Loki|muh)
dominik
parents: 276
diff changeset
   710
			_recv_file = fopen(tempfile, "wb");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   711
			if (!_recv_file) error("can't open savefile");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   712
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   713
		fwrite( (char*)fp + sizeof(*fp), n, 1, _recv_file);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   714
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   715
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   716
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
   717
static void HandleWelcomePacket(WelcomePacket *wp)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
   718
{
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   719
	int i;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   720
	for (i=0; i<MAX_PLAYERS; i++) {
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   721
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   722
		_player_seeds[i][0] = FROM_LE32(wp->player_seeds[i][0]);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   723
		_player_seeds[i][1] = FROM_LE32(wp->player_seeds[i][1]);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   724
		}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   725
	if (wp->frames_srv != 0) {
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   726
		_frame_counter_max = FROM_LE32(wp->frames_max);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   727
		_frame_counter_srv = FROM_LE32(wp->frames_srv);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   728
	}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   729
	if (wp->frames_cnt != 0) {
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
   730
		_frame_counter = FROM_LE32(wp->frames_cnt);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   731
	}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   732
}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   733
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   734
static void HandleReadyPacket(ReadyPacket *rp, ClientState *cs)
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   735
{
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   736
	cs->ready=true;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   737
	cs->timeout=_network_client_timeout;
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   738
	DEBUG(net,1) ("NET: %i] ready packet recv", _frame_counter);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   739
}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   740
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   741
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   742
static void CloseClient(ClientState *cs)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   743
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   744
	Packet *p, *next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   745
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   746
	DEBUG(net, 1) ("[NET][TCP] closed client connection");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   747
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   748
	assert(cs->socket != INVALID_SOCKET);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   749
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   750
	closesocket(cs->socket);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   751
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   752
	// free buffers
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   753
	for(p = cs->head; p; p=next) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   754
		next = p->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   755
		free(p);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   756
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   757
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   758
	// copy up structs...
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   759
	while ((cs+1)->socket != INVALID_SOCKET) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   760
		*cs = *(cs+1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   761
		cs++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   762
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   763
	cs->socket = INVALID_SOCKET;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   764
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   765
	if (_networking_server) _network_game.players_on--;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   766
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   767
	_num_clients--;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   768
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   769
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   770
#define NETWORK_BUFFER_SIZE 4096
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   771
static bool ReadPackets(ClientState *cs)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   772
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   773
	byte network_buffer[NETWORK_BUFFER_SIZE];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   774
	uint pos,size;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   775
	unsigned long recv_bytes;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   776
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   777
	size = cs->buflen;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   778
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   779
	for(;;) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   780
		if (size != 0) memcpy(network_buffer, cs->buf, size);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   781
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   782
		recv_bytes = recv(cs->socket, (char*)network_buffer + size, sizeof(network_buffer) - size, 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   783
		if ( recv_bytes == (unsigned long)-1) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   784
			int err = GET_LAST_ERROR();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   785
			if (err == EWOULDBLOCK) break;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   786
			DEBUG(net, 0) ("[NET] recv() failed with error %d", err);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   787
			CloseClient(cs);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   788
			return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   789
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   790
		// no more bytes for now?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   791
		if (recv_bytes == 0)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   792
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   793
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   794
		size += recv_bytes; // number of bytes read.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   795
		pos = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   796
		while (size >= 2) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   797
			byte *packet = network_buffer + pos;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   798
			// whole packet not there yet?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   799
			if (size < packet[0]) break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   800
			size -= packet[0];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   801
			pos += packet[0];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   802
			switch(packet[1]) {
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   803
			case PACKET_TYPE_WELCOME:
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   804
				HandleWelcomePacket((WelcomePacket *)packet);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   805
				break;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   806
			case PACKET_TYPE_COMMAND:
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   807
				HandleCommandPacket(cs, (CommandPacket*)packet);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   808
				break;
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   809
			case PACKET_TYPE_SYNC:
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   810
				assert(_networking_sync || _networking_queuing);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   811
				assert(!_networking_server);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   812
				HandleSyncPacket((SyncPacket*)packet);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   813
				break;
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   814
			case PACKET_TYPE_FSYNC:
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   815
				HandleFSyncPacket((FrameSyncPacket *)packet);
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   816
				break;
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   817
			case PACKET_TYPE_ACK:
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   818
				assert(!_networking_server);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   819
				HandleAckPacket((AckPacket*)packet);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   820
				break;
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   821
			case PACKET_TYPE_XMIT:
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   822
				HandleFilePacket((FilePacketHdr*)packet);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   823
				break;
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   824
			case PACKET_TYPE_READY:
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   825
				HandleReadyPacket((ReadyPacket*)packet, cs);
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   826
				break;
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   827
			case PACKET_TYPE_EVENT:
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   828
				HandleEventPacket((EventPacket*)packet);
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
   829
				break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   830
			default:
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   831
				DEBUG (net,0) ("NET: %i] unknown packet type",_frame_counter);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   832
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   833
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   834
175
d6cccece959a (svn r176) -Fix: network_gui const and warnings fixes (Tron)
darkvater
parents: 173
diff changeset
   835
		assert(size < sizeof(cs->buf));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   836
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   837
		memcpy(cs->buf, network_buffer + pos, size);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   838
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   839
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   840
	cs->buflen = size;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   841
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   842
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   843
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   844
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   845
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   846
static bool SendPackets(ClientState *cs)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   847
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   848
	Packet *p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   849
	int n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   850
	uint nskip = cs->eaten, nsent = nskip;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   851
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   852
	// try sending as much as possible.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   853
	for(p=cs->head; p ;p = p->next) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   854
		if (p->siz) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   855
			assert(nskip < p->siz);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   856
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   857
			n = send(cs->socket, p->buf + nskip, p->siz - nskip, 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   858
			if (n == -1) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   859
				int err = GET_LAST_ERROR();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   860
				if (err == EWOULDBLOCK) break;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   861
				DEBUG(net, 0) ("[NET] send() failed with error %d", err);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   862
				CloseClient(cs);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   863
				return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   864
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   865
			nsent += n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   866
			// send was not able to send it all? then we assume that the os buffer is full and break.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   867
			if (nskip + n != p->siz)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   868
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   869
			nskip = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   870
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   871
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   872
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   873
	// nsent bytes in the linked list are not invalid. free as many buffers as possible.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   874
	// don't actually free the last buffer.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   875
	while (nsent) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   876
		p = cs->head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   877
		assert(p->siz != 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   878
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   879
		// some bytes of the packet are still unsent.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   880
		if ( (int)(nsent - p->siz) < 0)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   881
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   882
		nsent -= p->siz;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   883
		p->siz = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   884
		if (p->next) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   885
			cs->head = p->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   886
			free(p);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   887
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   888
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   889
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   890
	cs->eaten = nsent;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   891
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   892
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   893
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   894
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   895
// transmit the file..
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   896
static void SendXmit(ClientState *cs)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   897
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   898
	uint pos, n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   899
	FilePacketHdr hdr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   900
	int p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   901
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   902
	// if too many unsent bytes left in buffer, don't send more.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   903
	if (cs->head && cs->head->next)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   904
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   905
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   906
	pos = cs->xmitpos - 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   907
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   908
	p = 20;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   909
	do {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   910
		// compute size of data to xmit
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   911
		n = minu(_transmit_file_size - pos, 248);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   912
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   913
		hdr.packet_length = n + sizeof(hdr);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   914
		hdr.packet_type = PACKET_TYPE_XMIT;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   915
		SendBytes(cs, &hdr, sizeof(hdr));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   916
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   917
		if (n == 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   918
			pos = -1; // eof
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   919
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   920
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   921
		SendBytes(cs, _transmit_file + pos, n);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   922
		pos += n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   923
	} while (--p);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   924
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   925
	cs->xmitpos = pos + 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   926
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   927
	if (cs->xmitpos == 0) {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   928
		NetworkSendWelcome(cs,false);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   929
	}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   930
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   931
	DEBUG(net, 2) ("[NET] client xmit at %d", pos + 1);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   932
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   933
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   934
static ClientState *AllocClient(SOCKET s)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   935
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   936
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   937
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   938
	if (_num_clients == MAX_CLIENTS)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   939
		return NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   940
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   941
	if (_networking_server) _network_game.players_on++;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   942
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   943
	cs = &_clients[_num_clients++];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   944
	memset(cs, 0, sizeof(*cs));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   945
	cs->last = &cs->head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   946
	cs->socket = s;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   947
	cs->timeout = _network_client_timeout;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   948
	return cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   949
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   950
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   951
void NetworkSendReadyPacket()
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   952
{
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   953
	if ((!_network_ready_sent) && (_frame_counter + _network_ready_ahead >= _frame_counter_max)) {
288
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
   954
		ReadyPacket rp;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   955
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   956
		DEBUG(net,1) ("NET: %i] ready packet sent", _frame_counter);
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   957
288
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
   958
		rp.packet_type = PACKET_TYPE_READY;
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
   959
		rp.packet_length = sizeof(rp);
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
   960
		SendBytes(_clients, &rp, sizeof(rp));
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
   961
		_network_ready_sent = true;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   962
	}
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
   963
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   964
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   965
void NetworkSendSyncPackets()
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   966
{
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   967
	ClientState *cs;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   968
	uint32 new_max;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   969
	SyncPacket sp;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   970
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   971
	new_max = _frame_counter + (int)_network_sync_freq;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   972
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
   973
	DEBUG(net,3) ("NET: %i] serv: sync max=%i, seed1=%i, seed2=%i",_frame_counter,new_max,_sync_seed_1,_sync_seed_2);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   974
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   975
	sp.packet_length = sizeof(sp);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   976
	sp.packet_type = PACKET_TYPE_SYNC;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   977
	sp.frames = new_max - _frame_counter_max;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   978
	sp.server = _frame_counter_max - _frame_counter;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   979
	sp.random_seed_1 = TO_LE32(_sync_seed_1);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   980
	sp.random_seed_2 = TO_LE32(_sync_seed_2);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   981
	_frame_counter_max = new_max;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   982
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   983
	// send it to all the clients and mark them unready
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   984
	for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
   985
		cs->ready=false;
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   986
		SendBytes(cs, &sp, sp.packet_length);
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   987
	}
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   988
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   989
}
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   990
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   991
void NetworkSendFrameSyncPackets()
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   992
{
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   993
	ClientState *cs;
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   994
	FrameSyncPacket fsp;
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   995
	if ((_frame_counter + 4) < _frame_counter_max) if ((_frame_fsync_last + 4 < _frame_counter)) {
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   996
		// this packet mantains some information about on which frame the server is
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   997
		fsp.frames = _frame_counter_max - _frame_counter;
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   998
		fsp.packet_type = PACKET_TYPE_FSYNC;
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
   999
		fsp.packet_length = sizeof (FrameSyncPacket);
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1000
		// send it to all the clients and mark them unready
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1001
		for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1002
			SendBytes(cs, &fsp, fsp.packet_length);
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1003
		}
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1004
		_frame_fsync_last = _frame_counter;
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1005
	}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1006
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1007
}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1008
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1009
void NetworkSendWelcome(ClientState *cs, bool direct) {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1010
	WelcomePacket wp;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1011
	int i;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1012
	wp.packet_type = PACKET_TYPE_WELCOME;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1013
	wp.packet_length = sizeof(WelcomePacket);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1014
	for (i=0; i<MAX_PLAYERS; i++) {
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
  1015
		wp.player_seeds[i][0]=TO_LE32(_player_seeds[i][0]);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
  1016
		wp.player_seeds[i][1]=TO_LE32(_player_seeds[i][1]);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1017
		}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1018
	if (direct) {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1019
		wp.frames_max=0;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1020
		wp.frames_srv=0;
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
  1021
		wp.frames_cnt=TO_LE32(_frame_counter);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1022
		SendDirectBytes(cs,(void *)&wp,wp.packet_length);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1023
	} else {
275
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
  1024
		wp.frames_max=TO_LE32(_frame_counter_max);
31a5354de6f4 (svn r281) -Fix: some endian issues fixed in network code
signde
parents: 269
diff changeset
  1025
		wp.frames_srv=TO_LE32(_frame_counter_srv);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1026
		wp.frames_cnt=0;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1027
		SendBytes(cs,(void *)&wp,wp.packet_length);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1028
	}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1029
}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1030
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1031
static void NetworkAcceptClients()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1032
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1033
	struct sockaddr_in sin;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1034
	SOCKET s;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1035
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1036
#ifndef __MORPHOS__
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1037
	int sin_len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1038
#else
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1039
	LONG sin_len; // for some reason we need a 'LONG' under MorphOS
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1040
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1041
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1042
	assert(_listensocket != INVALID_SOCKET);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1043
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1044
	for(;;) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1045
		sin_len = sizeof(sin);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1046
		s = accept(_listensocket, (struct sockaddr*)&sin, &sin_len);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1047
		if (s == INVALID_SOCKET) return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1048
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1049
		// set nonblocking mode for client socket
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1050
		{ unsigned long blocking = 1; ioctlsocket(s, FIONBIO, &blocking); }
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1051
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
  1052
		DEBUG(net, 1) ("NET: %i] got client from %s", _frame_counter, inet_ntoa(sin.sin_addr));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1053
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1054
		// set nodelay
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1055
		{int b = 1; setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b));}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1056
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1057
		cs = AllocClient(s);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1058
		if (cs == NULL) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1059
			// no more clients allowed?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1060
			closesocket(s);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1061
			continue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1062
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1063
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1064
		if (_networking_sync) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1065
			// a new client has connected. it needs a snapshot.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1066
			cs->inactive = true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1067
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1068
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1069
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1070
	// when a new client has joined. it needs different information depending on if it's at the game menu or in an active game.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1071
	// Game menu:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1072
	//  - list of players already in the game (name, company name, face, color)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1073
	//  - list of game settings and patch settings
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1074
	// Active game:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1075
	//  - the state of the world (includes player name, company name, player face, player color)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1076
	//  - list of the patch settings
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1077
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1078
	// Networking can be in several "states".
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1079
	//  * not sync - games don't need to be in sync, and frame counter is not synced. for example intro screen. all commands are executed immediately.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1080
	//  * sync - games are in sync
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1081
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1082
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1083
static void SendQueuedCommandsToNewClient(ClientState *cs)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1084
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1085
	// send the commands in the server queue to the new client.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1086
	QueuedCommand *qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1087
	SyncPacket sp;
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1088
	uint32 frame;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1089
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
  1090
	DEBUG(net, 2) ("NET: %i] sending queued commands to client",_frame_counter);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1091
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1092
	sp.packet_length = sizeof(sp);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1093
	sp.packet_type = PACKET_TYPE_SYNC;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1094
	sp.random_seed_1 = sp.random_seed_2 = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1095
	sp.server = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1096
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1097
	frame = _frame_counter;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1098
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1099
	for(qp=_command_queue.head; qp; qp = qp->next) {
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
  1100
		DEBUG(net, 4) ("NET: %i] sending cmd to be executed at %d (old %d)", _frame_counter, qp->frame, frame);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1101
		if (qp->frame > frame) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1102
			assert(qp->frame <= _frame_counter_max);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1103
			sp.frames = qp->frame - frame;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1104
			frame = qp->frame;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1105
			SendBytes(cs, &sp, sizeof(sp));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1106
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1107
		SendBytes(cs, &qp->cp, qp->cp.packet_length);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1108
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1109
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1110
	if (frame < _frame_counter_max) {
269
feebb45304ef (svn r275) -Fix: Client accidently marked as unready when sending framesync packets. [this caused occasional timeouts]
signde
parents: 262
diff changeset
  1111
		DEBUG(net, 4) ("NET: %i] sending queued sync %d (%d)",_frame_counter, _frame_counter_max, frame);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1112
		sp.frames = _frame_counter_max - frame;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1113
		SendBytes(cs, &sp, sizeof(sp));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1114
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1115
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1116
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1117
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1118
bool NetworkCheckClientReady()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1119
{
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1120
	bool ready_all = true;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1121
	uint16 count = 0;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1122
	ClientState *cs;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1123
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1124
	for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1125
		count++;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1126
		ready_all = ready_all && (cs->ready || cs->inactive || (cs->xmitpos>0));
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1127
		if (!cs->ready) cs->timeout-=1;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1128
		if (cs->timeout == 0) {
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1129
			SET_DPARAM16(0,count);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1130
			ShowErrorMessage(-1,STR_NETWORK_ERR_TIMEOUT,0,0);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1131
			CloseClient(cs);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1132
			}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1133
		}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1134
	return ready_all;
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1135
}
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1136
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1137
// ************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1138
// * TCP Networking         * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1139
// ************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1140
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1141
unsigned long NetworkResolveHost(const char *hostname)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1142
{
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1143
	struct hostent* remotehost;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1145
	if ((hostname[0]<0x30) || (hostname[0]>0x39)) {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1146
		// seems to be an hostname [first character is no number]
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1147
		remotehost = gethostbyname(hostname);
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1148
		if (remotehost == NULL) {
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1149
			DEBUG(net, 1) ("[NET][IP] cannot resolve %s", hostname);
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1150
			return 0;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1151
		} else {
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1152
			DEBUG(net, 1) ("[NET][IP] resolved %s to %s",hostname, inet_ntoa(*(struct in_addr *) remotehost->h_addr_list[0]));
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1153
			return inet_addr(inet_ntoa(*(struct in_addr *) remotehost->h_addr_list[0]));
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1154
			}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1155
	} else {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1156
		// seems to be an ip [first character is a number]
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1157
		return inet_addr(hostname);
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1158
		}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1159
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1160
}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1161
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1162
bool NetworkConnect(const char *hostname, int port)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1163
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1164
	SOCKET s;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1165
	struct sockaddr_in sin;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1166
	int b;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1167
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1168
	DEBUG(net, 1) ("[NET][TCP] Connecting to %s %d", hostname, port);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1169
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1170
	s = socket(AF_INET, SOCK_STREAM, 0);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1171
	if (s == INVALID_SOCKET) error("socket() failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1172
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1173
	b = 1;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1174
	setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b));
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1175
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1176
	sin.sin_family = AF_INET;
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1177
	sin.sin_addr.s_addr = NetworkResolveHost(hostname);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1178
	sin.sin_port = htons(port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1179
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1180
	if (connect(s, (struct sockaddr*) &sin, sizeof(sin)) != 0) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1181
		NetworkClose(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1182
		return false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1183
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1184
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1185
	// set nonblocking mode for socket..
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1186
	{ unsigned long blocking = 1; ioctlsocket(s, FIONBIO, &blocking); }
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1187
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1188
	// in client mode, only the first client field is used. it's pointing to the server.
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1189
	AllocClient(s);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1190
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1191
	// queue packets.. because we're waiting for the savegame.
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1192
	_networking_queuing = true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1193
	_frame_counter_max = 0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1194
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1195
	return true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1196
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1197
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1198
void NetworkListen()
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1199
{
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1200
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1201
	SOCKET ls;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1202
	struct sockaddr_in sin;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1203
	int port;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1204
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1205
	port = _network_server_port;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1206
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1207
	DEBUG(net, 1) ("[NET][TCP] listening on port %d", port);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1208
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1209
	ls = socket(AF_INET, SOCK_STREAM, 0);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1210
	if (ls == INVALID_SOCKET)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1211
		error("socket() on listen socket failed");
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1212
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1213
	// reuse the socket
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1214
	{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1215
		int reuse = 1; if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) == -1)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1216
			error("setsockopt() on listen socket failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1217
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1218
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1219
	// set nonblocking mode for socket
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1220
	{ unsigned long blocking = 1; ioctlsocket(ls, FIONBIO, &blocking); }
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1221
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1222
	sin.sin_family = AF_INET;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1223
	sin.sin_addr.s_addr = 0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1224
	sin.sin_port = htons(port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1225
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1226
	if (bind(ls, (struct sockaddr*)&sin, sizeof(sin)) != 0)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1227
		error("bind() failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1228
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1229
	if (listen(ls, 1) != 0)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1230
		error("listen() failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1231
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1232
	_listensocket = ls;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1233
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1234
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1235
void NetworkReceive()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1236
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1237
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1238
	int n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1239
	fd_set read_fd, write_fd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1240
	struct timeval tv;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1241
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1242
	FD_ZERO(&read_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1243
	FD_ZERO(&write_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1244
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1245
	for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1246
		FD_SET(cs->socket, &read_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1247
		FD_SET(cs->socket, &write_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1248
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1249
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1250
	// take care of listener port
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1251
	if (_networking_server) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1252
		FD_SET(_listensocket, &read_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1253
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1254
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1255
	tv.tv_sec = tv.tv_usec = 0; // don't block at all.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1256
#if !defined(__MORPHOS__) && !defined(__AMIGA__)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1257
	n = select(FD_SETSIZE, &read_fd, &write_fd, NULL, &tv);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1258
#else
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1259
	n = WaitSelect(FD_SETSIZE, &read_fd, &write_fd, NULL, &tv, NULL);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1260
#endif
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1261
	if ((n == -1) && (!_networking_server)) NetworkHandleConnectionLost();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1262
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1263
	// accept clients..
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1264
	if (_networking_server && FD_ISSET(_listensocket, &read_fd))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1265
		NetworkAcceptClients();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1266
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1267
	// read stuff from clients
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1268
	for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1269
		cs->writable = !!FD_ISSET(cs->socket, &write_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1270
		if (FD_ISSET(cs->socket, &read_fd)) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1271
			if (!ReadPackets(cs))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1272
				cs--;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1273
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1274
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1275
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1276
	// if we're a server, and any client needs a snapshot, create a snapshot and send all commands from the server queue to the client.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1277
	if (_networking_server && _transmit_file == NULL) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1278
		bool didsave = false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1279
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1280
		for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1281
			if (cs->inactive) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1282
				cs->inactive = false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1283
				// found a client waiting for a snapshot. make a snapshot.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1284
				if (!didsave) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1285
					char filename[256];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1286
					sprintf(filename, "%snetwork.tmp",  _path.autosave_dir);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1287
					didsave = true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1288
					if (SaveOrLoad(filename, SL_SAVE) != SL_OK) error("network savedump failed");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1289
					_transmit_file = ReadFileToMem(filename, &_transmit_file_size, 500000);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1290
					if (_transmit_file == NULL) error("network savedump failed to load");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1291
				}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1292
				// and start sending the file..
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1293
				cs->xmitpos = 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1294
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1295
				// send queue of commands to client.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1296
				SendQueuedCommandsToNewClient(cs);
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1297
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1298
				NetworkSendWelcome(cs, true);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1299
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1300
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1301
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1302
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1303
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1304
void NetworkSend()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1305
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1306
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1307
	void *free_xmit;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1308
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1309
	free_xmit = _transmit_file;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1310
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1311
	// send stuff to all clients
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1312
	for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1313
		if (cs->xmitpos) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1314
			if (cs->writable)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1315
				SendXmit(cs);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1316
			free_xmit = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1317
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1318
		if (cs->writable)	{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1319
			if (!SendPackets(cs)) cs--;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1320
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1321
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1322
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1323
	// no clients left that xmit the file, free it.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1324
	if (free_xmit) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1325
		_transmit_file = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1326
		free(free_xmit);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1327
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1328
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1329
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1330
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1331
void NetworkInitialize()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1332
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1333
	ClientState *cs;
1
0ea1e0a5c4df (svn r2) -Fix [993829] UDP Fixes (lucaspiller)
darkvater
parents: 0
diff changeset
  1334
206
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1335
	QueueClear(&_command_queue);
7f8c26d8526b (svn r207) -Codechange: randomizer handling
signde
parents: 193
diff changeset
  1336
	QueueClear(&_ack_queue);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1337
	_command_queue.last = &_command_queue.head;
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1338
	_network_game_list = NULL;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1339
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1340
	// invalidate all clients
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1341
	for(cs=_clients; cs != &_clients[MAX_CLIENTS]; cs++)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1342
		cs->socket = INVALID_SOCKET;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1343
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1344
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1345
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1346
void NetworkClose(bool client)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1347
{
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1348
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1349
	ClientState *cs;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1350
	// invalidate all clients
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1351
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1352
	for(cs=_clients; cs != &_clients[MAX_CLIENTS]; cs++) if (cs->socket != INVALID_SOCKET) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1353
		CloseClient(cs);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1354
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1355
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1356
	if (!client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1357
		// if in servermode --> close listener
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1358
		closesocket(_listensocket);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1359
		_listensocket= INVALID_SOCKET;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1360
		DEBUG(net, 1) ("[NET][TCP] closed listener on port %i", _network_server_port);
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1361
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1362
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1363
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1364
void NetworkShutdown()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1365
{
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1366
	_networking_server = false;
169
4081f1d1f393 (svn r170) -Fix: [1022902] network fix .. console fix bug [1018523]. Fixes some variable initialization errors and a console.h warning (sign_de)
darkvater
parents: 144
diff changeset
  1367
	_networking = false;
4081f1d1f393 (svn r170) -Fix: [1022902] network fix .. console fix bug [1018523]. Fixes some variable initialization errors and a console.h warning (sign_de)
darkvater
parents: 144
diff changeset
  1368
	_networking_sync = false;
4081f1d1f393 (svn r170) -Fix: [1022902] network fix .. console fix bug [1018523]. Fixes some variable initialization errors and a console.h warning (sign_de)
darkvater
parents: 144
diff changeset
  1369
	_frame_counter = 0;
4081f1d1f393 (svn r170) -Fix: [1022902] network fix .. console fix bug [1018523]. Fixes some variable initialization errors and a console.h warning (sign_de)
darkvater
parents: 144
diff changeset
  1370
	_frame_counter_max = 0;
4081f1d1f393 (svn r170) -Fix: [1022902] network fix .. console fix bug [1018523]. Fixes some variable initialization errors and a console.h warning (sign_de)
darkvater
parents: 144
diff changeset
  1371
	_frame_counter_srv = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1372
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1373
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1374
// switch to synced mode.
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1375
void NetworkStartSync(bool fcreset)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1376
{
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1377
	DEBUG(net, 3) ("[NET][SYNC] switching to synced game mode");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1378
	_networking_sync = true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1379
	_frame_counter = 0;
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1380
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1381
	if (fcreset) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1382
		_frame_counter_max = 0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1383
		_frame_counter_srv = 0;
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1384
		_frame_fsync_last = 0;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1385
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1386
	_num_future_seed = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1387
	_sync_seed_1 = _sync_seed_2 = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1388
	memset(_my_seed_list, 0, sizeof(_my_seed_list));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1389
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1390
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1391
// ************************** //
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1392
// * UDP Network Extensions * //
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1393
// ************************** //
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1394
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1395
void NetworkUDPListen(bool client)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1396
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1397
	SOCKET udp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1398
	struct sockaddr_in sin;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1399
	int port;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1400
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1401
	if (client) { port = _network_client_port; } else { port = _network_server_port; };
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1402
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1403
	DEBUG(net, 1) ("[NET][UDP] listening on port %i", port);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1404
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1405
	udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1406
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1407
	// this disables network
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1408
	_network_available = !(udp == INVALID_SOCKET);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1409
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1410
	// set nonblocking mode for socket
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1411
	{ unsigned long blocking = 1; ioctlsocket(udp, FIONBIO, &blocking); }
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1412
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1413
	sin.sin_family = AF_INET;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1414
	sin.sin_addr.s_addr = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1415
	sin.sin_port = htons(port);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1416
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1417
	if (bind(udp, (struct sockaddr*)&sin, sizeof(sin)) != 0)
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1418
		DEBUG(net, 1) ("[NET][UDP] error: bind failed on port %i", port);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1419
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1420
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1421
	// enable broadcasting
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1422
	{ unsigned long val=1; setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (char *) &val , sizeof(val)); }
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1423
	// allow reusing
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1424
	{ unsigned long val=1; setsockopt(udp, SOL_SOCKET, SO_REUSEADDR, (char *) &val , sizeof(val)); }
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1425
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1426
	if (client) { _udp_client_socket = udp; } else { _udp_server_socket = udp; } ;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1427
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1428
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1429
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1430
void NetworkUDPClose(bool client)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1431
{
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1432
	if (client) {
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1433
		DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1434
		closesocket(_udp_client_socket);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1435
		_udp_client_socket = INVALID_SOCKET;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1436
		} else {
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1437
		DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_server_port);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1438
		closesocket(_udp_server_socket);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1439
		_udp_server_socket = INVALID_SOCKET;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1440
		};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1441
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1442
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1443
void NetworkUDPReceive(bool client)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1444
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1445
	struct sockaddr_in client_addr;
173
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
  1446
#ifndef __MORPHOS__
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1447
	int client_len;
173
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
  1448
#else
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
  1449
	LONG client_len; // for some reason we need a 'LONG' under MorphOS
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
  1450
#endif
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1451
	int nbytes;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1452
	struct UDPPacket packet;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1453
	int packet_len;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1454
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1455
	SOCKET udp;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1456
	if (client) udp=_udp_client_socket; else udp=_udp_server_socket;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1457
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1458
	packet_len = sizeof(packet);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1459
	client_len = sizeof(client_addr);
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1460
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1461
	nbytes = recvfrom(udp, (char *) &packet, packet_len , 0, (struct sockaddr *) &client_addr, &client_len);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1462
	if (nbytes>0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1463
		if (packet.command_code==packet.command_check) switch (packet.command_code) {
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1464
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1465
 		case NET_UDPCMD_SERVERSEARCH:
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1466
 			if (!client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1467
				packet.command_check=packet.command_code=NET_UDPCMD_SERVERINFO;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1468
				memcpy(&packet.data,&_network_game,sizeof(_network_game));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1469
				packet.data_len=sizeof(_network_game);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1470
 				NetworkUDPSend(client,client_addr, packet);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1471
 			}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1472
 			break;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1473
		case NET_UDPCMD_GETSERVERINFO:
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1474
			if (!client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1475
				packet.command_check=packet.command_code=NET_UDPCMD_SERVERINFO;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1476
				memcpy(&packet.data,&_network_game,sizeof(_network_game));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1477
				packet.data_len=sizeof(_network_game);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1478
				NetworkUDPSend(client,client_addr, packet);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1479
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1480
			break;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1481
		case NET_UDPCMD_SERVERINFO:
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1482
 			if (client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1483
				NetworkGameList * item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1484
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1485
				item = (NetworkGameList *) NetworkGameListAdd();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1486
				item -> ip = inet_addr(inet_ntoa(client_addr.sin_addr));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1487
				item -> port = ntohs(client_addr.sin_port);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1488
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1489
				memcpy(item,&packet.data,packet.data_len);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1490
 			}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1491
 			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1492
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1493
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1494
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1495
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1496
void NetworkUDPBroadCast(bool client, struct UDPPacket packet)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1497
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1498
	int i=0, res;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1499
	struct sockaddr_in out_addr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1500
	uint32 bcaddr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1501
	byte * bcptr;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1502
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1503
	SOCKET udp;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1504
	if (client) udp=_udp_client_socket; else udp=_udp_server_socket;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1505
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1506
	while (_network_ip_list[i]!=0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1507
		bcaddr=_network_ip_list[i];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1508
		out_addr.sin_family = AF_INET;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1509
		if (client) { out_addr.sin_port = htons(_network_server_port); } else { out_addr.sin_port = htons(_network_client_port); };
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1510
		bcptr = (byte *) &bcaddr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1511
		bcptr[3]=255;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1512
		out_addr.sin_addr.s_addr = bcaddr;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1513
		res=sendto(udp,(char *) &packet,sizeof(packet),0,(struct sockaddr *) &out_addr,sizeof(out_addr));
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1514
		if (res==-1) DEBUG(net, 1)("udp: broadcast error: %i",GET_LAST_ERROR());
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1515
		i++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1516
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1517
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1518
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1519
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1520
void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1521
{
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1522
	SOCKET udp;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1523
	if (client) udp=_udp_client_socket; else udp=_udp_server_socket;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1524
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1525
	sendto(udp,(char *) &packet,sizeof(packet),0,(struct sockaddr *) &recv,sizeof(recv));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1526
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1527
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1528
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1529
bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1530
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1531
	struct UDPPacket packet;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1532
	int timeout=3000;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1533
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1534
	NetworkGameListClear();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1535
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1536
	DEBUG(net, 0) ("[NET][UDP] searching server");
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1537
	*_network_detected_serverip = "255.255.255.255";
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1538
	*_network_detected_serverport = 0;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1539
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1540
	packet.command_check=packet.command_code=NET_UDPCMD_SERVERSEARCH;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1541
	packet.data_len=0;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1542
	NetworkUDPBroadCast(true, packet);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1543
	while (timeout>=0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1544
		CSleep(100);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1545
		timeout-=100;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1546
	    NetworkUDPReceive(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1547
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1548
		if (_network_game_count>0) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1549
			NetworkGameList * item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1550
			item = (NetworkGameList *) NetworkGameListItem(0);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1551
			*_network_detected_serverip=inet_ntoa(*(struct in_addr *) &item->ip);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1552
			*_network_detected_serverport=item->port;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1553
 			timeout=-1;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1554
 			DEBUG(net, 0) ("[NET][UDP] server found on %s", *_network_detected_serverip);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1555
 			}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1556
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1557
		}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1558
175
d6cccece959a (svn r176) -Fix: network_gui const and warnings fixes (Tron)
darkvater
parents: 173
diff changeset
  1559
	return (*_network_detected_serverport>0);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1560
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1561
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1562
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1563
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1564
// *************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1565
// * New Network Core System * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1566
// *************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1567
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1568
void NetworkIPListInit()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1569
{
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1570
	struct hostent* he = NULL;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1571
	char hostname[250];
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1572
	uint32 bcaddr;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1573
	int i=0;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1574
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1575
	gethostname(hostname,250);
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1576
	DEBUG(net, 2) ("[NET][IP] init for host %s", hostname);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1577
	he=gethostbyname((char *) hostname);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1578
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1579
	if (he == NULL) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1580
		he = gethostbyname("localhost");
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1581
		}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1582
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1583
	if (he == NULL) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1584
		bcaddr = inet_addr("127.0.0.1");
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1585
		he = gethostbyaddr(inet_ntoa(*(struct in_addr *) &bcaddr), sizeof(bcaddr), AF_INET);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1586
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1587
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1588
	if (he == NULL) {
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1589
		DEBUG(net, 2) ("[NET][IP] cannot resolve %s", hostname);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1590
	} else {
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1591
		while(he->h_addr_list[i]) {
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1592
			bcaddr = inet_addr(inet_ntoa(*(struct in_addr *) he->h_addr_list[i]));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1593
			_network_ip_list[i]=bcaddr;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1594
			DEBUG(net, 2) ("[NET][IP] add %s",inet_ntoa(*(struct in_addr *) he->h_addr_list[i]));
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1595
			i++;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1596
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1597
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1598
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1599
	_network_ip_list[i]=0;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1600
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1601
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1602
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1603
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1604
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1605
void NetworkCoreInit()
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1606
{
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1607
	DEBUG(net, 3) ("[NET][Core] init()");
220
dc1710f96b39 (svn r221) -Feature: console command and variable hooking
signde
parents: 218
diff changeset
  1608
	_network_available = true;
dc1710f96b39 (svn r221) -Feature: console command and variable hooking
signde
parents: 218
diff changeset
  1609
	_network_client_timeout = 300;
dc1710f96b39 (svn r221) -Feature: console command and variable hooking
signde
parents: 218
diff changeset
  1610
	_network_ready_ahead = 1;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1611
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1612
	// [win32] winsock startup
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1613
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1614
	#if defined(WIN32)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1615
	{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1616
		WSADATA wsa;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1617
		DEBUG(net, 3) ("[NET][Core] using windows socket library");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1618
		if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1619
			DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1620
			_network_available=false;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1621
			}
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1622
	}
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1623
	#else
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1624
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1625
	// [morphos/amigaos] bsd-socket startup
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1626
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1627
	#if defined(__MORPHOS__) || defined(__AMIGA__)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1628
	{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1629
		DEBUG(misc,3) ("[NET][Core] using bsd socket library");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1630
		if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1631
			DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1632
			_network_available=false;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1633
			}
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1634
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1635
		#if !defined(__MORPHOS__)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1636
		// for usleep() implementation (only required for legacy AmigaOS builds)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1637
		if ( (TimerPort = CreateMsgPort()) ) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1638
			if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1639
				if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1640
					if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1641
						// free ressources...
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1642
						DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer.");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1643
						_network_available=false;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1644
					}
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1645
				}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1646
			}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1647
		}
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1648
		#endif
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1649
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1650
	}
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1651
	#else
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1652
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1653
	// [linux/macos] unix-socket startup
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1654
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1655
		DEBUG(net, 3) ("[NET][Core] using unix socket library");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1656
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1657
	#endif
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1658
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1659
	#endif
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1660
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1661
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1662
	if (_network_available) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1663
		DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1664
		// initiate network ip list
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1665
		NetworkIPListInit();
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1666
	} else
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1667
		DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1668
}
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1669
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1670
/* *************************************************** */
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1671
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1672
void NetworkCoreShutdown()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1673
{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1674
	DEBUG(net, 3) ("[NET][Core] shutdown()");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1675
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1676
	#if defined(__MORPHOS__) || defined(__AMIGA__)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1677
	{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1678
		// free allocated ressources
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1679
		#if !defined(__MORPHOS__)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1680
		if (TimerBase)    { CloseDevice((struct IORequest *) TimerRequest); }
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1681
		if (TimerRequest) { DeleteIORequest(TimerRequest); }
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1682
		if (TimerPort)    { DeleteMsgPort(TimerPort); }
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1683
		#endif
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1684
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1685
		if (SocketBase) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1686
			CloseLibrary(SocketBase);
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1687
		}
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1688
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1689
	#endif
173
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
  1690
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1691
	#if defined(WIN32)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1692
	{ WSACleanup();}
173
df7c566d219f (svn r174) -Network: [ 023268] small network.c changes/cleanups (MorphOS/AmigaOS) and one compiler warning fix (MorphOS) (tokai)
darkvater
parents: 172
diff changeset
  1693
	#endif
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1694
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1695
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1696
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1697
228
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1698
void ParseConnectionString(const byte **player, const byte **port, byte *connection_string)
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1699
{
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1700
	byte c = 0;
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1701
	while (connection_string[c] != '\0') {
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1702
		if (connection_string[c] == '#') {
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1703
			*player = &connection_string[c+1];
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1704
			connection_string[c] = '\0';
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1705
		}
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1706
		if (connection_string[c] == ':') {
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1707
			*port = &connection_string[c+1];
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1708
			connection_string[c] = '\0';
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1709
		}
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1710
		c++;
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1711
	}
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1712
}
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1713
175
d6cccece959a (svn r176) -Fix: network_gui const and warnings fixes (Tron)
darkvater
parents: 173
diff changeset
  1714
bool NetworkCoreConnectGame(const byte* b, unsigned short port)
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1715
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1716
	if (!_network_available) return false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1717
175
d6cccece959a (svn r176) -Fix: network_gui const and warnings fixes (Tron)
darkvater
parents: 173
diff changeset
  1718
	if (strcmp(b,"auto")==0) {
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1719
		// do autodetect
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1720
		NetworkUDPSearchGame(&b, &port);
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
  1721
	}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1722
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1723
	if (port==0) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1724
		// autodetection failed
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1725
		if (_networking_override) NetworkLobbyShutdown();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1726
		ShowErrorMessage(-1, STR_NETWORK_ERR_NOSERVER, 0, 0);
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
  1727
		_switch_mode_errorstr = STR_NETWORK_ERR_NOSERVER;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1728
		return false;
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
  1729
	}
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
  1730
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1731
	NetworkInitialize();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1732
	_networking = NetworkConnect(b, port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1733
	if (_networking) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1734
		NetworkLobbyShutdown();
247
1cbc32ff06eb (svn r248) -Feature: console script files "exec myscript.file"
darkvater
parents: 239
diff changeset
  1735
		IConsoleCmdExec("exec scripts/on_client.scr 0");
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
  1736
	} else {
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1737
		if (_networking_override)
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
  1738
			NetworkLobbyShutdown();
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1739
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1740
		ShowErrorMessage(-1, STR_NETWORK_ERR_NOCONNECTION,0,0);
172
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
  1741
		_switch_mode_errorstr = STR_NETWORK_ERR_NOCONNECTION;
8d8b3383470d (svn r173) -Network: [1023231] Debug Code + ErrorBoxes + Load Game/Scenario. Added some more desync debug code and replaced some of the error() calls with some better error boxes. Hopefully find desyncs easier (sign_de)
darkvater
parents: 169
diff changeset
  1742
	}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1743
	return _networking;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1744
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1745
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1746
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1747
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1748
bool NetworkCoreConnectGameStruct(NetworkGameList * item)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1749
{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1750
	return NetworkCoreConnectGame(inet_ntoa(*(struct in_addr *) &item->ip),item->port);
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1751
}
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1752
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1753
/* *************************************************** */
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1754
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1755
bool NetworkCoreStartGame()
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1756
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1757
	if (!_network_available) return false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1758
	NetworkLobbyShutdown();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1759
	NetworkInitialize();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1760
	NetworkListen();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1761
	NetworkUDPListen(false);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1762
	_networking_server = true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1763
	_networking = true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1764
	NetworkGameFillDefaults(); // clears the network game info
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1765
	_network_game.players_on++; // the serverplayer is online
247
1cbc32ff06eb (svn r248) -Feature: console script files "exec myscript.file"
darkvater
parents: 239
diff changeset
  1766
	// execute server initialization script
1cbc32ff06eb (svn r248) -Feature: console script files "exec myscript.file"
darkvater
parents: 239
diff changeset
  1767
	IConsoleCmdExec("exec scripts/on_server.scr 0");
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1768
	return true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1769
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1770
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1771
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1772
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1773
void NetworkCoreDisconnect()
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1774
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1775
	/* terminate server */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1776
	if (_networking_server) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1777
		NetworkUDPClose(false);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1778
		NetworkClose(false);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1779
		}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1780
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1781
	/* terminate client connection */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1782
	else if (_networking) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1783
		NetworkClose(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1784
		}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1785
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1786
	NetworkShutdown();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1787
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1788
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1789
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1790
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1791
void NetworkCoreLoop(bool incomming)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1792
{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1793
	if (incomming) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1794
		// incomming
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1795
		if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1796
		if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1797
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1798
		if (_networking)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1799
			NetworkReceive();
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1800
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1801
	} else {
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1802
		if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1803
		if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1804
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1805
		if (_networking)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1806
			NetworkSend();
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1807
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1808
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1809
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1810
void NetworkLobbyInit()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1811
{
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1812
	DEBUG(net, 3) ("[NET][Lobby] init()");
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1813
	NetworkUDPListen(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1814
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1815
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1816
void NetworkLobbyShutdown()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1817
{
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1818
	DEBUG(net, 3) ("[NET][Lobby] shutdown()");
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1819
	NetworkUDPClose(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1820
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1821
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1822
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1823
// ******************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1824
// * Network Game List Extensions * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1825
// ******************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1826
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1827
void NetworkGameListClear()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1828
{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1829
	NetworkGameList * item;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1830
	NetworkGameList * next;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1831
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1832
	DEBUG(net, 4) ("[NET][G-List] cleared server list");
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1833
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1834
	item = _network_game_list;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1835
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1836
	while (item != NULL) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1837
		next = (NetworkGameList *) item -> _next;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1838
		free (item);
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1839
		item = next;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1840
	}
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1841
	_network_game_list=NULL;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1842
	_network_game_count=0;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1843
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1844
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1845
NetworkGameList * NetworkGameListAdd()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1846
{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1847
	NetworkGameList * item;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1848
	NetworkGameList * before;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1849
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1850
	DEBUG(net, 4) ("[NET][G-List] added server to list");
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1851
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1852
	item = _network_game_list;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1853
	before = item;
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1854
	while (item != NULL) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1855
		before = item;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1856
		item = (NetworkGameList *) item -> _next;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1857
	}
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1858
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1859
	item = malloc(sizeof(NetworkGameList));
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1860
	item -> _next = NULL;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1861
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1862
	if (before == NULL) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1863
		_network_game_list = item;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1864
	} else
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1865
		before -> _next = item;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1866
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1867
	_network_game_count++;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1868
	return item;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1869
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1870
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1871
void NetworkGameListFromLAN()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1872
{
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1873
	struct UDPPacket packet;
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1874
	DEBUG(net, 2) ("[NET][G-List] searching server over lan");
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1875
	NetworkGameListClear();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1876
	packet.command_check=packet.command_code=NET_UDPCMD_SERVERSEARCH;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1877
	packet.data_len=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1878
	NetworkUDPBroadCast(true,packet);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1879
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1880
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1881
void NetworkGameListFromInternet()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1882
{
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1883
	DEBUG(net, 2) ("[NET][G-List] searching servers over internet");
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1884
	NetworkGameListClear();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1885
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1886
	// **TODO** masterserver communication [internet protocol list]
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1887
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1888
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1889
NetworkGameList * NetworkGameListItem(uint16 index)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1890
{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1891
	NetworkGameList * item;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1892
	NetworkGameList * next;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1893
	uint16 cnt = 0;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1894
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1895
	item = _network_game_list;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1896
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1897
	while ((item != NULL) && (cnt != index)) {
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1898
		next = (NetworkGameList *) item -> _next;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1899
		item = next;
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1900
		cnt++;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1901
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1902
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1903
	return item;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1904
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1905
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1906
// *************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1907
// * Network Game Extensions * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1908
// *************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1909
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1910
void NetworkGameFillDefaults()
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1911
{
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1912
	NetworkGameInfo * game = &_network_game;
288
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
  1913
	#if defined(WITH_REV)
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
  1914
		extern char _openttd_revision[];
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
  1915
	#else
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
  1916
		const char _openttd_revision[] = "norev000";
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
  1917
	#endif
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1918
185
646403e35006 (svn r186) -Add: debug 'net' for network debug (sign_de)
truelight
parents: 177
diff changeset
  1919
	DEBUG(net, 4) ("[NET][G-Info] setting defaults");
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1920
288
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
  1921
	ttd_strlcpy(game->server_name, "OpenTTD Game", sizeof(game->server_name));
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1922
	game->game_password[0]='\0';
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1923
	game->map_name[0]='\0';
288
6bd97cdf1652 (svn r294) -Fix: autorail always builds rail, instead of occasional rail removal (on pressing hotkey after pressing 'bulldozer')
darkvater
parents: 281
diff changeset
  1924
	ttd_strlcpy(game->server_revision, _openttd_revision, sizeof(game->server_revision));
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1925
	game->game_date=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1926
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1927
	game->map_height=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1928
	game->map_width=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1929
	game->map_set=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1930
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1931
	game->players_max=8;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1932
	game->players_on=0;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 188
diff changeset
  1933
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1934
	game->server_lang=_dynlang.curr;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1935
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1936
211
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1937
void NetworkGameChangeDate(uint16 newdate)
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1938
{
2954c4b30525 (svn r212) -Fix: Network-gui fixes (sign_de)
darkvater
parents: 208
diff changeset
  1939
	if (_networking_server)
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1940
		_network_game.game_date = newdate;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1941
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1942
8
9ab81ef450f2 (svn r9) Fixed a couple of warnings and minor coding issues
dominik
parents: 1
diff changeset
  1943
#else // not ENABLE_NETWORK
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1944
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1945
// stubs
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1946
void NetworkInitialize() {}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1947
void NetworkShutdown() {}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1948
void NetworkListen() {}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1949
void NetworkConnect(const char *hostname, int port) {}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1950
void NetworkReceive() {}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1951
void NetworkSend() {}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1952
void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback) {}
239
23958632a582 (svn r240) -Fix: desync on subsidy generation
signde
parents: 228
diff changeset
  1953
void NetworkSendEvent(uint16 type, uint16 data_len, void * data) {};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1954
void NetworkProcessCommands() {}
106
51354fbb3e8a (svn r107) Small fix for compiling without networking
dominik
parents: 105
diff changeset
  1955
void NetworkStartSync(bool fcreset) {}
208
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1956
void NetworkSendReadyPacket() {}
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1957
void NetworkSendSyncPackets() {}
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1958
void NetworkSendFrameSyncPackets() {}
f3998d4089f0 (svn r209) -Fix: network code based desync
signde
parents: 206
diff changeset
  1959
bool NetworkCheckClientReady() { return true; }
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1960
void NetworkCoreInit() { _network_available=false; };
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1961
void NetworkCoreShutdown() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1962
void NetworkCoreDisconnect() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1963
void NetworkCoreLoop(bool incomming) {};
228
f65dec6727d9 (svn r229) -Fix: Some more const stuff fixed .(Tron)
darkvater
parents: 222
diff changeset
  1964
void ParseConnectionString(const byte **player, const byte **port, byte *connection_string) {};
177
71fec20dd4a8 (svn r178) -Fix: small network fix if network is not enabled
darkvater
parents: 175
diff changeset
  1965
bool NetworkCoreConnectGame(const byte* b, unsigned short port) {return false;};
106
51354fbb3e8a (svn r107) Small fix for compiling without networking
dominik
parents: 105
diff changeset
  1966
bool NetworkCoreStartGame() {return false;};
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1967
void NetworkLobbyShutdown() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1968
void NetworkLobbyInit() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1969
void NetworkGameListClear() {};
218
6ece1c23c246 (svn r219) -Fix: fixed network stub declerations
darkvater
parents: 213
diff changeset
  1970
NetworkGameList * NetworkGameListAdd() {return NULL;};
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1971
void NetworkGameListFromLAN() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1972
void NetworkGameListFromInternet() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1973
void NetworkGameFillDefaults() {};
218
6ece1c23c246 (svn r219) -Fix: fixed network stub declerations
darkvater
parents: 213
diff changeset
  1974
NetworkGameList * NetworkGameListItem(uint16 index) {return NULL;};
220
dc1710f96b39 (svn r221) -Feature: console command and variable hooking
signde
parents: 218
diff changeset
  1975
bool NetworkCoreConnectGameStruct(NetworkGameList * item) {return false;};
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1976
void NetworkGameChangeDate(uint16 newdate) {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1977
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1978
#endif