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