network.c
author darkvater
Fri, 27 Aug 2004 11:01:26 +0000
changeset 144 6b42494d405e
parent 110 a22a6b07904b
child 169 4081f1d1f393
permissions -rw-r--r--
(svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
-Fix [1013884] network.c diffs (MorphOS/ AmigaOS) (tokaiz)
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
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    65
// usleep() implementation
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    66
#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
    67
#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
    68
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    69
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
    70
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
    71
struct timerequest  *TimerRequest = NULL;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
    72
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    73
#endif /* __MORPHOS__ || __AMIGA__ */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    74
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    75
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    76
#define SEND_MTU 1460
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
#if defined(ENABLE_NETWORK)
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
// 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
    81
// 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
    82
typedef struct CommandPacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    83
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    84
	byte packet_type;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    85
	uint16 cmd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    86
	uint32 p1,p2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    87
	TileIndex tile;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    88
	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
    89
	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
    90
	uint32 dp[8];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    91
} CommandPacket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    92
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    93
assert_compile(sizeof(CommandPacket) == 16 + 32);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    94
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    95
#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
    96
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    97
// 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
    98
// and how far the client may progress.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    99
typedef struct SyncPacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   100
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   101
	byte packet_type;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   102
	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
   103
	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
   104
	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
   105
	uint32 random_seed_2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   106
} SyncPacket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   107
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   108
assert_compile(sizeof(SyncPacket) == 12);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   109
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   110
// 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
   111
// 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
   112
typedef struct AckPacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   113
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   114
	byte packet_type;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   115
} AckPacket;
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
typedef struct FilePacketHdr {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   118
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   119
	byte packet_type;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   120
	byte unused[2];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   121
} FilePacketHdr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   122
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   123
assert_compile(sizeof(FilePacketHdr) == 4);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   124
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   125
// 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
   126
typedef struct WelcomePacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   127
	byte packet_length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   128
	byte packet_type;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   129
	byte unused[2];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   130
} WelcomePacket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   131
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   132
typedef struct Packet Packet;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   133
struct Packet {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   134
	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
   135
	uint siz;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   136
	byte buf[SEND_MTU]; // packet payload
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   137
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   138
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   139
typedef struct ClientState {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   140
	int socket;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   141
	bool inactive; // disable sending of commands/syncs to client
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   142
	bool writable;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   143
	uint xmitpos;
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
	uint eaten;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   146
	Packet *head, **last;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   147
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   148
	uint buflen;											// receive buffer len
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   149
	byte buf[256];										// receive buffer
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   150
} ClientState;
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
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   153
static uint _not_packet;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   154
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   155
typedef struct QueuedCommand QueuedCommand;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   156
struct QueuedCommand {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   157
	QueuedCommand *next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   158
	CommandPacket cp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   159
	CommandCallback *callback;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   160
	uint32 cmd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   161
	int32 frame;
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
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   164
typedef struct CommandQueue CommandQueue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   165
struct CommandQueue {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   166
	QueuedCommand *head, **last;
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
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   169
#define MAX_CLIENTS (MAX_PLAYERS + 1)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   170
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   171
// 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
   172
// 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
   173
static CommandQueue _command_queue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   174
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   175
// 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
   176
// 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
   177
static CommandQueue _ack_queue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   178
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   179
static ClientState _clients[MAX_CLIENTS];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   180
static int _num_clients;
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
// 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
   183
static uint32 _my_seed_list[16][2];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   184
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   185
typedef struct FutureSeeds {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   186
	int32 frame;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   187
	uint32 seed[2];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   188
} FutureSeeds;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   189
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   190
// 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
   191
static FutureSeeds _future_seed[8];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   192
static int _num_future_seed;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   193
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   194
static SOCKET _listensocket; // tcp socket
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   195
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   196
static SOCKET _udp_client_socket; // udp server socket
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   197
static SOCKET _udp_server_socket; // udp client socket
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   198
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   199
typedef struct UDPPacket {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   200
	byte command_code;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   201
	byte data_len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   202
	byte command_check;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   203
	byte data[255];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   204
} UDPPacket;
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
enum {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   207
	NET_UDPCMD_SERVERSEARCH = 1,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   208
	NET_UDPCMD_SERVERACTIVE,
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   209
	NET_UDPCMD_GETSERVERINFO,
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   210
	NET_UDPCMD_SERVERINFO,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   211
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   212
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   213
void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   214
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   215
uint32 _network_ip_list[10]; // network ip list
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   216
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   217
// this is set to point to the savegame
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   218
static byte *_transmit_file;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   219
static size_t _transmit_file_size;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   220
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   221
static FILE *_recv_file;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   222
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   223
typedef struct NetworkGameInfo {	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   224
	char server_name[40]; // name of the game
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   225
	char server_revision[8]; // server game version
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   226
	byte server_lang; // langid
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   227
	byte players_max; // max players allowed on server
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   228
	byte players_on; // current count of players on server
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   229
	uint16 game_date; // current date
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   230
	char game_password[10]; // should fit ... 14 chars
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   231
	char map_name[40]; // map which is played ["random" for a randomized map]
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   232
	uint map_width; // map width / 8
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   233
	uint map_height; // map height / 8
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   234
	byte map_set; // graphical set
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   235
} NetworkGameInfo;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   236
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   237
typedef struct NetworkGameList {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   238
	NetworkGameInfo item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   239
	uint32 ip;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   240
	uint16 port;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   241
	char * _next;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   242
} NetworkGameList;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   243
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   244
static NetworkGameInfo _network_game;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   245
static NetworkGameList * _network_game_list = NULL;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   246
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   247
/* multi os compatible sleep function */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   248
void CSleep(int milliseconds) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   249
#if defined(WIN32)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   250
Sleep(milliseconds);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   251
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   252
#if defined(UNIX)
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   253
#if !defined(__BEOS__) && !defined(__MORPHOS__) && !defined(__AMIGAOS__) 
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   254
usleep(milliseconds*1000);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   255
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   256
#ifdef __BEOS__
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   257
snooze(milliseconds*1000);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   258
#endif
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   259
#if defined(__MORPHOS__) || defined(__AMIGAOS__)
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   260
{
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   261
	ULONG signals;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   262
	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
   263
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   264
	// send IORequest
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   265
	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
   266
	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
   267
	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
   268
	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
   269
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   270
	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
   271
		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
   272
	}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   273
	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
   274
}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   275
#endif // __MORPHOS__ || __AMIGAOS__
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   276
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   277
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   278
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   279
//////////////////////////////////////////////////////////////////////
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   280
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   281
// ****************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   282
// * TCP Packets and Handlers   * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   283
// ****************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   284
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   285
static QueuedCommand *AllocQueuedCommand(CommandQueue *nq)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   286
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   287
	QueuedCommand *qp = (QueuedCommand*)calloc(sizeof(QueuedCommand), 1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   288
	assert(qp);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   289
	*nq->last = qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   290
	nq->last = &qp->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   291
	return qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   292
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   293
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   294
// 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
   295
// 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
   296
void NetworkProcessCommands()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   297
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   298
	CommandQueue *nq;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   299
	QueuedCommand *qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   300
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   301
	// queue mode ?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   302
	if (_networking_queuing)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   303
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   304
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   305
	nq = &_command_queue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   306
	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
   307
		// unlink it.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   308
		if (!(nq->head = qp->next)) nq->last = &nq->head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   309
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   310
		if (qp->frame < _frame_counter && _networking_sync) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   311
			error("!qp->cp.frame < _frame_counter, %d < %d\n", qp->frame, _frame_counter);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   312
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   313
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   314
		// run the command
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   315
		_current_player = qp->cp.player;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   316
		memcpy(_decode_parameters, qp->cp.dp, (qp->cp.packet_length - COMMAND_PACKET_BASE_SIZE));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   317
		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
   318
		free(qp);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   319
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   320
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   321
	if (!_networking_server) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   322
		// 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
   323
		_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
   324
		_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
   325
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   326
		while (_num_future_seed) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   327
			assert(_future_seed[0].frame >= _frame_counter);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   328
			if (_future_seed[0].frame != _frame_counter) break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   329
			if (_future_seed[0].seed[0] != _sync_seed_1 ||_future_seed[0].seed[1] != _sync_seed_2)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   330
				error("!network sync error");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   331
			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
   332
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   333
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   334
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   335
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   336
// send a packet to a client
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   337
static void SendBytes(ClientState *cs, void *bytes, uint len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   338
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   339
	byte *b = (byte*)bytes;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   340
	uint n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   341
	Packet *p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   342
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   343
	assert(len != 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   344
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   345
	// see if there's space in the last packet?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   346
	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
   347
		p = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   348
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   349
	do {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   350
		if (!p) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   351
			// need to allocate a new packet buffer.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   352
			p = (Packet*)malloc(sizeof(Packet));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   353
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   354
			// insert at the end of the linked list.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   355
			*cs->last = p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   356
			cs->last = &p->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   357
			p->next = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   358
			p->siz = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   359
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   360
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   361
		// copy bytes to packet.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   362
		n = minu(sizeof(p->buf) - p->siz, len);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   363
		memcpy(p->buf + p->siz, b, n);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   364
		p->siz += n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   365
		b += n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   366
		p = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   367
	} while (len -= n);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   368
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   369
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   370
// client:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   371
//   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
   372
// server:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   373
//   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
   374
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
   375
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   376
	int nump;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   377
	QueuedCommand *qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   378
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   379
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   380
	qp = AllocQueuedCommand(_networking_server ? &_command_queue : &_ack_queue);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   381
	qp->cp.packet_type = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   382
	qp->cp.tile = tile;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   383
	qp->cp.p1 = p1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   384
	qp->cp.p2 = p2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   385
	qp->cp.cmd = (uint16)cmd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   386
	qp->cp.player = _local_player;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   387
	qp->cp.when = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   388
	qp->cmd = cmd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   389
	qp->callback = callback;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   390
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   391
	// so the server knows when to execute it.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   392
	qp->frame = _frame_counter_max;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   393
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   394
	// calculate the amount of extra bytes.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   395
	nump = 8;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   396
	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
   397
	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
   398
	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
   399
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   400
#if defined(TTD_BIG_ENDIAN)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   401
	// 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
   402
	{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   403
		CommandPacket cp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   404
		cp = qp->cp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   405
		cp.cmd = TO_LE16(cp.cmd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   406
		cp.tile = TO_LE16(cp.tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   407
		cp.p1 = TO_LE32(cp.p1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   408
		cp.p2 = TO_LE32(cp.p2);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   409
		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
   410
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   411
#else
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   412
	// send it to the peers
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   413
	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
   414
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   415
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   416
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   417
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   418
// client:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   419
//   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
   420
//   put it in the command queue.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   421
//
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   422
// server:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   423
//   client sends a command that it wants to execute.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   424
//   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
   425
//   put it in the appropriate player queue.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   426
//   send it to all other clients.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   427
//   send an ack packet to the actual client.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   428
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   429
static void HandleCommandPacket(ClientState *cs, CommandPacket *np)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   430
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   431
	QueuedCommand *qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   432
	ClientState *c;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   433
	AckPacket ap;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   434
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   435
	printf("net: cmd size %d\n", np->packet_length);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   436
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   437
	assert(np->packet_length >= COMMAND_PACKET_BASE_SIZE);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   438
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   439
	// put it into the command queue
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   440
	qp = AllocQueuedCommand(&_command_queue);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   441
	qp->cp = *np;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   442
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   443
	qp->frame = _frame_counter_max;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   444
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   445
	qp->callback = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   446
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   447
	// extra params
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   448
	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
   449
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   450
	ap.packet_type = 2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   451
	ap.packet_length = 2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   452
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   453
	// send it to the peers
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   454
	if (_networking_server) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   455
		for(c=_clients; c->socket != INVALID_SOCKET; c++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   456
			if (c == cs) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   457
				SendBytes(c, &ap, 2);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   458
			} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   459
				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
   460
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   461
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   462
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   463
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   464
// convert from little endian to big endian?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   465
#if defined(TTD_BIG_ENDIAN)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   466
	qp->cp.cmd = TO_LE16(qp->cp.cmd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   467
	qp->cp.tile = TO_LE16(qp->cp.tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   468
	qp->cp.p1 = TO_LE32(qp->cp.p1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   469
	qp->cp.p2 = TO_LE32(qp->cp.p2);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   470
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   471
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   472
	qp->cmd = qp->cp.cmd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   473
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   474
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   475
// 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
   476
// and how far the client may progress.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   477
static void HandleSyncPacket(SyncPacket *sp)
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
	uint32 s1,s2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   480
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   481
	_frame_counter_srv = _frame_counter_max - sp->server;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   482
	_frame_counter_max += sp->frames;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   483
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   484
	printf("net: sync max=%d  cur=%d  server=%d\n", _frame_counter_max, _frame_counter, _frame_counter_srv);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   485
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   486
	// queueing only?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   487
	if (_networking_queuing || _frame_counter == 0)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   488
		return;
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
	s1 = TO_LE32(sp->random_seed_1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   491
	s2 = TO_LE32(sp->random_seed_2);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   492
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   493
	if (_frame_counter_srv <= _frame_counter) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   494
		// 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
   495
		if (_frame_counter_srv + 16 > _frame_counter) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   496
			// the random seed exists in our array check it.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   497
			if (s1 != _my_seed_list[_frame_counter_srv & 0xF][0] || s2 != _my_seed_list[_frame_counter_srv & 0xF][1])
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   498
				error("!network is desynched\n");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   499
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   500
	} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   501
		// 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
   502
		if (_num_future_seed < lengthof(_future_seed)) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   503
			_future_seed[_num_future_seed].frame = _frame_counter_srv;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   504
			_future_seed[_num_future_seed].seed[0] = s1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   505
			_future_seed[_num_future_seed].seed[1] = s2;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   506
			_num_future_seed++;
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
	}
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
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   511
// 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
   512
// 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
   513
static void HandleAckPacket()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   514
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   515
	QueuedCommand *q;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   516
	// 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
   517
	q = _ack_queue.head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   518
	assert(q);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   519
	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
   520
	q->next = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   521
	q->frame = _frame_counter_max;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   522
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   523
	*_command_queue.last = q;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   524
	_command_queue.last = &q->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   525
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   526
	printf("net: ack\n");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   527
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   528
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   529
static void HandleFilePacket(FilePacketHdr *fp)
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
	int n = fp->packet_length - sizeof(FilePacketHdr);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   532
	if (n == 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   533
		assert(_networking_queuing);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   534
		assert(!_networking_sync);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   535
		// eof
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   536
		if (_recv_file) { fclose(_recv_file); _recv_file = NULL; }
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   537
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   538
		// attempt loading the game.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   539
		_game_mode = GM_NORMAL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   540
		if (SaveOrLoad("networkc.tmp", SL_LOAD) != SL_OK) error("network load failed");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   541
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   542
		// sync to server.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   543
		_networking_queuing = false;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   544
		NetworkStartSync(false);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   545
/*		
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   546
		_networking_sync = true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   547
		_frame_counter = 0; // start executing at frame 0.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   548
		_sync_seed_1 = _sync_seed_2 = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   549
		_num_future_seed = 0;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   550
		memset(_my_seed_list, 0, sizeof(_my_seed_list)); */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   551
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   552
		if (_network_playas == 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   553
			// send a command to make a new player
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   554
			_local_player = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   555
			NetworkSendCommand(0, 0, 0, CMD_PLAYER_CTRL, NULL);
1
0ea1e0a5c4df (svn r2) -Fix [993829] UDP Fixes (lucaspiller)
darkvater
parents: 0
diff changeset
   556
			_local_player = OWNER_SPECTATOR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   557
		} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   558
			// take control over an existing company
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   559
			if (DEREF_PLAYER(_network_playas-1)->is_active)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   560
				_local_player = _network_playas-1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   561
			else
1
0ea1e0a5c4df (svn r2) -Fix [993829] UDP Fixes (lucaspiller)
darkvater
parents: 0
diff changeset
   562
				_local_player = OWNER_SPECTATOR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   563
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   564
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   565
	} else {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   566
		if(!_recv_file) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   567
			_recv_file = fopen("networkc.tmp", "wb");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   568
			if (!_recv_file) error("can't open savefile");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   569
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   570
		fwrite( (char*)fp + sizeof(*fp), n, 1, _recv_file);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   571
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   572
}
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
static void CloseClient(ClientState *cs)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   575
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   576
	Packet *p, *next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   577
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   578
	DEBUG(misc,1) ("[NET][TCP] closed client connection");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   579
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   580
	assert(cs->socket != INVALID_SOCKET);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   581
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   582
	closesocket(cs->socket);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   583
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   584
	// free buffers
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   585
	for(p = cs->head; p; p=next) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   586
		next = p->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   587
		free(p);
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
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   590
	// copy up structs...
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   591
	while ((cs+1)->socket != INVALID_SOCKET) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   592
		*cs = *(cs+1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   593
		cs++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   594
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   595
	cs->socket = INVALID_SOCKET;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   596
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   597
	if (_networking_server) _network_game.players_on--;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   598
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   599
	_num_clients--;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   600
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   601
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   602
#define NETWORK_BUFFER_SIZE 4096
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   603
static bool ReadPackets(ClientState *cs)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   604
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   605
	byte network_buffer[NETWORK_BUFFER_SIZE];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   606
	uint pos,size;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   607
	unsigned long recv_bytes;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   608
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   609
	size = cs->buflen;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   610
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   611
	for(;;) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   612
		if (size != 0) memcpy(network_buffer, cs->buf, size);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   613
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   614
		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
   615
		if ( recv_bytes == (unsigned long)-1) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   616
			int err = GET_LAST_ERROR();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   617
			if (err == EWOULDBLOCK) break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   618
			printf("net: recv() failed with error %d\n", err);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   619
			CloseClient(cs);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   620
			return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   621
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   622
		// no more bytes for now?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   623
		if (recv_bytes == 0)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   624
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   625
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   626
		size += recv_bytes; // number of bytes read.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   627
		pos = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   628
		while (size >= 2) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   629
			byte *packet = network_buffer + pos;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   630
			// whole packet not there yet?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   631
			if (size < packet[0]) break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   632
			size -= packet[0];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   633
			pos += packet[0];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   634
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   635
			switch(packet[1]) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   636
			case 0:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   637
				HandleCommandPacket(cs, (CommandPacket*)packet);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   638
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   639
			case 1:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   640
				assert(_networking_sync || _networking_queuing);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   641
				assert(!_networking_server);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   642
				HandleSyncPacket((SyncPacket*)packet);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   643
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   644
			case 2:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   645
				assert(!_networking_server);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   646
				HandleAckPacket();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   647
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   648
			case 3:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   649
				HandleFilePacket((FilePacketHdr*)packet);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   650
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   651
			default:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   652
				error("unknown packet type");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   653
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   654
		}
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
		assert(size>=0 && size < sizeof(cs->buf));
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
		memcpy(cs->buf, network_buffer + pos, size);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   659
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   660
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   661
	cs->buflen = size;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   662
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   663
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   664
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   665
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   666
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   667
static bool SendPackets(ClientState *cs)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   668
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   669
	Packet *p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   670
	int n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   671
	uint nskip = cs->eaten, nsent = nskip;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   672
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   673
	// try sending as much as possible.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   674
	for(p=cs->head; p ;p = p->next) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   675
		if (p->siz) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   676
			assert(nskip < p->siz);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   677
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   678
			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
   679
			if (n == -1) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   680
				int err = GET_LAST_ERROR();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   681
				if (err == EWOULDBLOCK) break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   682
				printf("net: send() failed with error %d\n", err);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   683
				CloseClient(cs);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   684
				return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   685
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   686
			nsent += n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   687
			// 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
   688
			if (nskip + n != p->siz)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   689
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   690
			nskip = 0;
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
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   693
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   694
	// 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
   695
	// don't actually free the last buffer.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   696
	while (nsent) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   697
		p = cs->head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   698
		assert(p->siz != 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   699
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   700
		// some bytes of the packet are still unsent.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   701
		if ( (int)(nsent - p->siz) < 0)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   702
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   703
		nsent -= p->siz;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   704
		p->siz = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   705
		if (p->next) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   706
			cs->head = p->next;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   707
			free(p);
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
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   711
	cs->eaten = nsent;
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
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   714
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   715
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   716
// transmit the file..
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   717
static void SendXmit(ClientState *cs)
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
	uint pos, n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   720
	FilePacketHdr hdr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   721
	int p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   722
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   723
	// 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
   724
	if (cs->head && cs->head->next)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   725
		return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   726
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   727
	pos = cs->xmitpos - 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   728
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   729
	p = 20;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   730
	do {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   731
		// compute size of data to xmit
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   732
		n = minu(_transmit_file_size - pos, 248);
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
		hdr.packet_length = n + sizeof(hdr);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   735
		hdr.packet_type = 3;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   736
		hdr.unused[0] = hdr.unused[1] = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   737
		SendBytes(cs, &hdr, sizeof(hdr));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   738
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   739
		if (n == 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   740
			pos = -1; // eof
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   741
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   742
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   743
		SendBytes(cs, _transmit_file + pos, n);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   744
		pos += n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   745
	} while (--p);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   746
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   747
	cs->xmitpos = pos + 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   748
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   749
	printf("net: client xmit at %d\n", pos + 1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   750
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   751
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   752
static ClientState *AllocClient(SOCKET s)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   753
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   754
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   755
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   756
	if (_num_clients == MAX_CLIENTS)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   757
		return NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   758
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   759
	if (_networking_server) _network_game.players_on++;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   760
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   761
	cs = &_clients[_num_clients++];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   762
	memset(cs, 0, sizeof(*cs));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   763
	cs->last = &cs->head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   764
	cs->socket = s;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   765
	return cs;
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
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   769
static void NetworkAcceptClients()
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
	struct sockaddr_in sin;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   772
	SOCKET s;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   773
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   774
#ifndef __MORPHOS__
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   775
	int sin_len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   776
#else
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   777
	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
   778
#endif
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
	assert(_listensocket != INVALID_SOCKET);
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
	for(;;) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   783
		sin_len = sizeof(sin);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   784
		s = accept(_listensocket, (struct sockaddr*)&sin, &sin_len);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   785
		if (s == INVALID_SOCKET) return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   786
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   787
		// set nonblocking mode for client socket
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   788
		{ unsigned long blocking = 1; ioctlsocket(s, FIONBIO, &blocking); }
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   789
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   790
		printf("net: got client from %s\n", inet_ntoa(sin.sin_addr));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   791
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   792
		// set nodelay
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   793
		{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
   794
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   795
		cs = AllocClient(s);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   796
		if (cs == NULL) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   797
			// no more clients allowed?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   798
			closesocket(s);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   799
			continue;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   800
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   801
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   802
		if (_networking_sync) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   803
			// a new client has connected. it needs a snapshot.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   804
			cs->inactive = true;
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
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   808
	// 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
   809
	// Game menu:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   810
	//  - 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
   811
	//  - list of game settings and patch settings
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   812
	// Active game:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   813
	//  - 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
   814
	//  - list of the patch settings
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   815
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   816
	// Networking can be in several "states".
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   817
	//  * 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
   818
	//  * sync - games are in sync
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   819
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   820
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
static void SendQueuedCommandsToNewClient(ClientState *cs)
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
	// 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
   825
	QueuedCommand *qp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   826
	SyncPacket sp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   827
	int32 frame;
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
	printf("net: sending queued commands to client\n");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   830
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   831
	sp.packet_length = sizeof(sp);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   832
	sp.packet_type = 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   833
	sp.random_seed_1 = sp.random_seed_2 = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   834
	sp.server = 0;
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
	frame = _frame_counter;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   837
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   838
	for(qp=_command_queue.head; qp; qp = qp->next) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   839
		printf("net: sending cmd to be executed at %d (old %d)\n", qp->frame, frame);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   840
		if (qp->frame > frame) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   841
			assert(qp->frame <= _frame_counter_max);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   842
			sp.frames = qp->frame - frame;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   843
			frame = qp->frame;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   844
			SendBytes(cs, &sp, sizeof(sp));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   845
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   846
		SendBytes(cs, &qp->cp, qp->cp.packet_length);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   847
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   848
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   849
	if (frame < _frame_counter_max) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   850
		printf("net: sending queued sync %d (%d)\n", _frame_counter_max, frame);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   851
		sp.frames = _frame_counter_max - frame;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   852
		SendBytes(cs, &sp, sizeof(sp));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   853
	}
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
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   856
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   857
// ************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   858
// * TCP Networking         * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   859
// ************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   860
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   861
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
   862
	struct hostent* remotehost;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   863
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   864
	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
   865
		// 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
   866
		remotehost = gethostbyname(hostname);
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   867
		if (remotehost == NULL) {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   868
			DEBUG(misc, 2) ("[NET][IP] cannot resolve %s", hostname);
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   869
			return 0;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   870
		} else {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   871
			DEBUG(misc,2) ("[NET][IP] resolved %s to %s",hostname, 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
   872
			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
   873
			}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   874
	} else {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   875
		// 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
   876
		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
   877
		}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   878
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   879
}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
   880
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   881
bool NetworkConnect(const char *hostname, int port)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   882
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   883
	SOCKET s;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   884
	struct sockaddr_in sin;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   885
	int b;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   886
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   887
	DEBUG(misc, 1) ("[NET][TCP] Connecting to %s %d", hostname, port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   888
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   889
	s = socket(AF_INET, SOCK_STREAM, 0);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   890
	if (s == INVALID_SOCKET) error("socket() failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   891
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   892
	b = 1;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   893
	setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   894
	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   895
	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
   896
	sin.sin_addr.s_addr = NetworkResolveHost(hostname);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   897
	sin.sin_port = htons(port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   898
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   899
	if (connect(s, (struct sockaddr*) &sin, sizeof(sin)) != 0) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   900
		NetworkClose(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   901
		return false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   902
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   903
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   904
	// set nonblocking mode for socket..
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   905
	{ unsigned long blocking = 1; ioctlsocket(s, FIONBIO, &blocking); }
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   906
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   907
	// 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
   908
	AllocClient(s);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   909
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   910
	// queue packets.. because we're waiting for the savegame.
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   911
	_networking_queuing = true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   912
	_frame_counter_max = 0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   913
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   914
	return true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   915
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   916
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   917
void NetworkListen()
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   918
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   919
		
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   920
	SOCKET ls;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   921
	struct sockaddr_in sin;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   922
	int port;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   923
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   924
	port = _network_server_port;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   925
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   926
	DEBUG(misc, 1) ("[NET][TCP] listening on port %d", port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   927
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   928
	ls = socket(AF_INET, SOCK_STREAM, 0);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   929
	if (ls == INVALID_SOCKET)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   930
		error("socket() on listen socket failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   931
	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   932
	// reuse the socket
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   933
	{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   934
		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
   935
			error("setsockopt() on listen socket failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   936
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   937
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   938
	// set nonblocking mode for socket
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   939
	{ unsigned long blocking = 1; ioctlsocket(ls, FIONBIO, &blocking); }
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   940
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   941
	sin.sin_family = AF_INET;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   942
	sin.sin_addr.s_addr = 0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   943
	sin.sin_port = htons(port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   944
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   945
	if (bind(ls, (struct sockaddr*)&sin, sizeof(sin)) != 0)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   946
		error("bind() failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   947
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   948
	if (listen(ls, 1) != 0)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   949
		error("listen() failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   950
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   951
	_listensocket = ls;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   952
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
   953
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   954
void NetworkReceive()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   955
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   956
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   957
	int n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   958
	fd_set read_fd, write_fd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   959
	struct timeval tv;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   960
	
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   961
	FD_ZERO(&read_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   962
	FD_ZERO(&write_fd);
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
	for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   965
		FD_SET(cs->socket, &read_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   966
		FD_SET(cs->socket, &write_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   967
	}
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
	// take care of listener port
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   970
	if (_networking_server) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   971
		FD_SET(_listensocket, &read_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   972
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   973
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   974
	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
   975
#if !defined(__MORPHOS__) && !defined(__AMIGA__)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   976
	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
   977
#else
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   978
	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
   979
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   980
	if (n == -1) error("select failed");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   981
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   982
	// accept clients..
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   983
	if (_networking_server && FD_ISSET(_listensocket, &read_fd))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   984
		NetworkAcceptClients();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   985
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   986
	// read stuff from clients
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   987
	for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   988
		cs->writable = !!FD_ISSET(cs->socket, &write_fd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   989
		if (FD_ISSET(cs->socket, &read_fd)) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   990
			if (!ReadPackets(cs))
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   991
				cs--;
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
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   994
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   995
	// 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
   996
	if (_networking_server && _transmit_file == NULL) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   997
		bool didsave = false;
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
		for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1000
			if (cs->inactive) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1001
				cs->inactive = false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1002
				// 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
  1003
				if (!didsave) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1004
					char filename[256];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1005
					sprintf(filename, "%snetwork.tmp",  _path.autosave_dir);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1006
					didsave = true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1007
					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
  1008
					_transmit_file = ReadFileToMem(filename, &_transmit_file_size, 500000);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1009
					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
  1010
				}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1011
				// and start sending the file..
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1012
				cs->xmitpos = 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1013
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1014
				// send queue of commands to client.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1015
				SendQueuedCommandsToNewClient(cs);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1016
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1017
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1018
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1019
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1020
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1021
void NetworkSend()
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
	ClientState *cs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1024
	void *free_xmit;
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
	// send sync packets?
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1027
	if (_networking_server && _networking_sync && !_pause) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1028
		if (++_not_packet >= _network_sync_freq) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1029
			SyncPacket sp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1030
			uint new_max;
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
			_not_packet = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1033
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1034
			new_max = max(_frame_counter + (int)_network_ahead_frames, _frame_counter_max);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1035
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1036
			sp.packet_length = sizeof(sp);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1037
			sp.packet_type = 1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1038
			sp.frames = new_max - _frame_counter_max;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1039
			sp.server = _frame_counter_max - _frame_counter;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1040
			sp.random_seed_1 = TO_LE32(_sync_seed_1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1041
			sp.random_seed_2 = TO_LE32(_sync_seed_2);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1042
			_frame_counter_max = new_max;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1043
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1044
			// send it to all the clients
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1045
			for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) SendBytes(cs, &sp, sizeof(sp));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1046
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1047
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1048
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1049
	free_xmit = _transmit_file;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1050
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1051
	// send stuff to all clients
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1052
	for(cs=_clients;cs->socket != INVALID_SOCKET; cs++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1053
		if (cs->xmitpos) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1054
			if (cs->writable)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1055
				SendXmit(cs);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1056
			free_xmit = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1057
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1058
		if (cs->writable)	{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1059
			if (!SendPackets(cs)) cs--;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1060
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1061
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1062
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1063
	// no clients left that xmit the file, free it.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1064
	if (free_xmit) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1065
		_transmit_file = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1066
		free(free_xmit);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1067
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1068
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1069
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1070
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1071
void NetworkInitialize()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1072
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1073
	ClientState *cs;
1
0ea1e0a5c4df (svn r2) -Fix [993829] UDP Fixes (lucaspiller)
darkvater
parents: 0
diff changeset
  1074
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1075
	_command_queue.last = &_command_queue.head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1076
	_ack_queue.last = &_ack_queue.head;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1077
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1078
	// invalidate all clients
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1079
	for(cs=_clients; cs != &_clients[MAX_CLIENTS]; cs++)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1080
		cs->socket = INVALID_SOCKET;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1081
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1082
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1083
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1084
void NetworkClose(bool client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1085
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1086
	ClientState *cs;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1087
	// invalidate all clients
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1088
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1089
	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
  1090
		CloseClient(cs);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1091
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1092
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1093
	if (!client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1094
		// if in servermode --> close listener
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1095
		closesocket(_listensocket);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1096
		_listensocket= INVALID_SOCKET;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1097
		DEBUG(misc,1) ("[NET][TCP] closed listener on port %i", _network_server_port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1098
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1099
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1100
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1101
void NetworkShutdown()
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1102
{
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1103
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1104
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1105
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1106
// switch to synced mode.
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1107
void NetworkStartSync(bool fcreset)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1108
{
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1109
	DEBUG(misc,3) ("[NET][SYNC] switching to synced game mode");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1110
	_networking_sync = true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1111
	_frame_counter = 0;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1112
	if (fcreset) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1113
		_frame_counter_max = 0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1114
		_frame_counter_srv = 0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1115
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1116
	_num_future_seed = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1117
	_sync_seed_1 = _sync_seed_2 = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1118
	memset(_my_seed_list, 0, sizeof(_my_seed_list));
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1119
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1120
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1121
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1122
// ********************************* //
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1123
// * 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
  1124
// ********************************* //
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1125
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1126
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
  1127
	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
  1128
	if (argc==2) {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1129
		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
  1130
		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
  1131
	} 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
  1132
		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
  1133
		NetworkCoreConnectGame(argv[1],atoi(argv[2]));
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1134
		}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1135
	return NULL;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1136
}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1137
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1138
// ************************** //
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1139
// * UDP Network Extensions * //
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1140
// ************************** //
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1141
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1142
void NetworkUDPListen(bool client)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1143
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1144
	SOCKET udp;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1145
	struct sockaddr_in sin;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1146
	int port;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1147
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1148
	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
  1149
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1150
	DEBUG(misc,1) ("[NET][UDP] listening on port %i", port);
0
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
	udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1153
	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1154
	// this disables network
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1155
	_network_available = !(udp == INVALID_SOCKET);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1156
	
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1157
	// set nonblocking mode for socket
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1158
	{ unsigned long blocking = 1; ioctlsocket(udp, FIONBIO, &blocking); }
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
	sin.sin_family = AF_INET;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1161
	sin.sin_addr.s_addr = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1162
	sin.sin_port = htons(port);
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
	if (bind(udp, (struct sockaddr*)&sin, sizeof(sin)) != 0)
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1165
		DEBUG(misc,1) ("[NET][UDP] error: bind failed on port %i", port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1166
		
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1167
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1168
	// enable broadcasting
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1169
	{ 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
  1170
	// allow reusing
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1171
	{ 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
  1172
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1173
	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
  1174
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1175
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1176
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1177
void NetworkUDPClose(bool client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1178
	if (client) { 
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1179
		DEBUG(misc,1) ("[NET][UDP] closed listener on port %i", _network_client_port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1180
		closesocket(_udp_client_socket);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1181
		_udp_client_socket = INVALID_SOCKET;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1182
		} else {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1183
		DEBUG(misc,1) ("[NET][UDP] closed listener on port %i", _network_server_port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1184
		closesocket(_udp_server_socket);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1185
		_udp_server_socket = INVALID_SOCKET;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1186
		};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1187
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1188
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1189
void NetworkUDPReceive(bool client) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1190
	struct sockaddr_in client_addr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1191
	int client_len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1192
	int nbytes;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1193
	struct UDPPacket packet;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1194
	int packet_len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1195
	
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1196
	SOCKET udp;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1197
	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
  1198
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1199
	packet_len = sizeof(packet);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1200
	client_len = sizeof(client_addr);	
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1201
	
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1202
	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
  1203
	if (nbytes>0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1204
		if (packet.command_code==packet.command_check) switch (packet.command_code) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1205
		
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1206
 		case NET_UDPCMD_SERVERSEARCH:
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1207
 			if (!client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1208
				packet.command_check=packet.command_code=NET_UDPCMD_SERVERINFO;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1209
				memcpy(&packet.data,&_network_game,sizeof(_network_game));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1210
				packet.data_len=sizeof(_network_game);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1211
 				NetworkUDPSend(client,client_addr, packet);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1212
 			}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1213
 			break;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1214
		case NET_UDPCMD_GETSERVERINFO:
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1215
			if (!client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1216
				packet.command_check=packet.command_code=NET_UDPCMD_SERVERINFO;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1217
				memcpy(&packet.data,&_network_game,sizeof(_network_game));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1218
				packet.data_len=sizeof(_network_game);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1219
				NetworkUDPSend(client,client_addr, packet);
0
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
			break;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1222
		case NET_UDPCMD_SERVERINFO:
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1223
 			if (client) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1224
				NetworkGameList * item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1225
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1226
				item = (NetworkGameList *) NetworkGameListAdd();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1227
				item -> ip = inet_addr(inet_ntoa(client_addr.sin_addr));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1228
				item -> port = ntohs(client_addr.sin_port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1229
				
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1230
				memcpy(item,&packet.data,packet.data_len);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1231
 			}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1232
 			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1233
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1234
	}
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
81
1759d41e3d43 (svn r82) -Fix ttd.rc issues on non VS compilers
darkvater
parents: 8
diff changeset
  1237
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1238
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1239
void NetworkUDPBroadCast(bool client, struct UDPPacket packet) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1240
	int i=0, res;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1241
	struct sockaddr_in out_addr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1242
	uint32 bcaddr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1243
	byte * bcptr;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1244
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1245
	SOCKET udp;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1246
	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
  1247
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1248
	while (_network_ip_list[i]!=0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1249
		bcaddr=_network_ip_list[i];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1250
		out_addr.sin_family = AF_INET;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1251
		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
  1252
		bcptr = (byte *) &bcaddr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1253
		bcptr[3]=255;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1254
		out_addr.sin_addr.s_addr = bcaddr;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1255
		res=sendto(udp,(char *) &packet,sizeof(packet),0,(struct sockaddr *) &out_addr,sizeof(out_addr));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1256
		if (res==-1) error("udp: broadcast error: %i",GET_LAST_ERROR());
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1257
		i++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1258
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1259
	
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1260
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1261
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1262
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
  1263
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1264
	SOCKET udp;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1265
	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
  1266
	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1267
	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
  1268
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1269
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1270
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1271
bool NetworkUDPSearchGame(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
  1272
	struct UDPPacket packet;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1273
	int timeout=3000;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1274
	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1275
	NetworkGameListClear();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1276
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1277
	DEBUG(misc,0) ("[NET][UDP] searching server");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1278
	*_network_detected_serverip = "255.255.255.255";
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1279
	*_network_detected_serverport = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1280
	
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1281
	packet.command_check=packet.command_code=NET_UDPCMD_SERVERSEARCH;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1282
	packet.data_len=0;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1283
	NetworkUDPBroadCast(true, packet);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1284
	while (timeout>=0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1285
		CSleep(100);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1286
		timeout-=100;
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1287
	    NetworkUDPReceive(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1288
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1289
		if (_network_game_count>0) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1290
			NetworkGameList * item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1291
			item = (NetworkGameList *) NetworkGameListItem(0);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1292
			*_network_detected_serverip=inet_ntoa(*(struct in_addr *) &item->ip);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1293
			*_network_detected_serverport=item->port;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1294
 			timeout=-1;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1295
 			DEBUG(misc,0) ("[NET][UDP] server found on %s", *_network_detected_serverip);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1296
 			}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1297
	
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1298
		}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1299
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1300
	return (_network_detected_serverport>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
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1303
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1304
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1305
// *************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1306
// * New Network Core System * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1307
// *************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1308
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1309
void NetworkIPListInit() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1310
	struct hostent* he = NULL;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1311
	char hostname[250];
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1312
	uint32 bcaddr;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1313
	int i=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1314
		
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1315
	gethostname(hostname,250);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1316
	DEBUG(misc,2) ("[NET][IP] init for host %s", hostname);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1317
	he=gethostbyname((char *) hostname);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1318
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1319
	if (he == NULL) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1320
		he = gethostbyname("localhost");
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1321
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1322
	
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1323
	if (he == NULL) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1324
		bcaddr = inet_addr("127.0.0.1");
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 106
diff changeset
  1325
		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
  1326
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1327
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1328
	if (he == NULL) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1329
		DEBUG(misc, 2) ("[NET][IP] cannot resolve %s", hostname);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1330
	} else {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1331
		while(he->h_addr_list[i]) { 
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1332
			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
  1333
			_network_ip_list[i]=bcaddr;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1334
			DEBUG(misc,2) ("[NET][IP] add %s",inet_ntoa(*(struct in_addr *) he->h_addr_list[i]));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1335
			i++;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1336
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1337
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1338
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1339
	_network_ip_list[i]=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1340
	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1341
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1342
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1343
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1344
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1345
void NetworkCoreInit() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1346
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1347
DEBUG(misc,3) ("[NET][Core] init()");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1348
_network_available=true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1349
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1350
// [win32] winsock startup
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1351
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1352
#if defined(WIN32)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1353
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1354
	WSADATA wsa;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1355
	DEBUG(misc,3) ("[NET][Core] using windows socket library");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1356
	if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1357
		DEBUG(misc,3) ("[NET][Core] error: WSAStartup failed");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1358
		_network_available=false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1359
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1360
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1361
#else 
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1362
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1363
// [morphos/amigaos] bsd-socket startup
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1364
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1365
#if defined(__MORPHOS__) || defined(__AMIGA__)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1366
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1367
	DEBUG(misc,3) ("[NET][Core] using bsd socket library");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1368
	if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1369
		DEBUG(misc,3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1370
		_network_available=false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1371
		}
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1372
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1373
	// for usleep() implementation
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1374
	if ( (TimerPort = CreateMsgPort()) ) {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1375
		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
  1376
			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
  1377
				if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) {
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1378
					// free ressources... 
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1379
					DEBUG(misc,3) ("[NET][Core] Couldn't initialize timer.");
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1380
					_network_available=false;
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1381
				}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1382
			}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1383
		}
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1384
	}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1385
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1386
#else
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1387
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1388
// [linux/macos] unix-socket startup
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1389
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1390
	DEBUG(misc,3) ("[NET][Core] using unix socket library");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1391
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1392
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1393
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1394
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1395
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1396
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1397
if (_network_available) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1398
	DEBUG(misc,3) ("[NET][Core] OK: multiplayer available");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1399
	// initiate network ip list
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1400
	NetworkIPListInit();
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1401
	IConsoleCmdRegister("connect",NetworkConsoleCmdConnect);
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1402
	} else {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1403
	DEBUG(misc,3) ("[NET][Core] FAILED: multiplayer not available");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1404
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1405
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1406
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1407
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1408
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1409
void NetworkCoreShutdown() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1410
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1411
DEBUG(misc,3) ("[NET][Core] shutdown()");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1412
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1413
#if defined(__MORPHOS__) || defined(__AMIGA__)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1414
{	
144
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1415
	// free allocated ressources
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1416
  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
  1417
  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
  1418
  if (TimerPort)    { DeleteMsgPort(TimerPort); }
6b42494d405e (svn r145) -Fix: [1016921] Network Name Resolution for not only connecting with IP. (sign_de)
darkvater
parents: 110
diff changeset
  1419
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1420
	if (SocketBase) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1421
		CloseLibrary(SocketBase);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1422
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1423
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1424
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1425
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1426
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1427
#if defined(WIN32)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1428
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1429
	WSACleanup();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1430
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1431
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1432
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
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1435
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1436
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1437
bool NetworkCoreConnectGame(byte* b, unsigned short port)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1438
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1439
	if (!_network_available) return false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1440
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1441
	if (strcmp((char *) b,"auto")==0) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1442
		// do autodetect
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1443
		NetworkUDPSearchGame(&b, &port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1444
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1445
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1446
	if (port==0) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1447
		// autodetection failed
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1448
		if (_networking_override) NetworkLobbyShutdown();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1449
		ShowErrorMessage(-1, STR_NETWORK_ERR_NOSERVER, 0, 0);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1450
		return false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1451
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1452
	NetworkInitialize();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1453
	_networking = NetworkConnect(b, port);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1454
	if (_networking) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1455
		NetworkLobbyShutdown();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1456
		} else {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1457
		if (_networking_override) NetworkLobbyShutdown();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1458
		ShowErrorMessage(-1, STR_NETWORK_ERR_NOCONNECTION,0,0);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1459
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1460
	return _networking;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1461
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1462
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1463
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1464
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1465
bool NetworkCoreStartGame()
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1466
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1467
	if (!_network_available) return false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1468
	NetworkLobbyShutdown();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1469
	NetworkInitialize();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1470
	NetworkListen();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1471
	NetworkUDPListen(false);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1472
	_networking_server = true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1473
	_networking = true;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1474
	NetworkGameFillDefaults(); // clears the network game info
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1475
	_network_game.players_on++; // the serverplayer is online
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1476
	return 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
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1479
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1480
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1481
void NetworkCoreDisconnect()
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1482
{
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1483
	/* terminate server */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1484
	if (_networking_server) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1485
		NetworkUDPClose(false);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1486
		NetworkClose(false);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1487
		} 
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1488
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1489
	/* terminate client connection */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1490
	else if (_networking) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1491
		NetworkClose(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1492
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1493
	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1494
	_networking_server = false;	
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1495
	_networking = false;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1496
	NetworkShutdown();
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
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1499
/* *************************************************** */
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1500
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1501
void NetworkCoreLoop(bool incomming) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1502
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1503
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1504
if (incomming) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1505
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1506
	// incomming
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1507
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1508
	if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1509
	if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1510
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1511
	if (_networking) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1512
		NetworkReceive();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1513
		NetworkProcessCommands(); // to check if we got any new commands belonging to the current frame before we increase it.
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1514
		}
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
	} else {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1517
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1518
	// outgoing
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1519
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1520
	if (_networking) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1521
		NetworkSend();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1522
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1523
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1524
	}
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
void NetworkLobbyInit() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1529
	DEBUG(misc,3) ("[NET][Lobby] init()");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1530
	NetworkUDPListen(true);
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
void NetworkLobbyShutdown() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1534
	DEBUG(misc,3) ("[NET][Lobby] shutdown()");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1535
	NetworkUDPClose(true);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1536
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1537
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1538
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
// * Network Game List Extensions * //
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
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1543
void NetworkGameListClear() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1544
NetworkGameList * item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1545
NetworkGameList * next; 
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1546
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1547
DEBUG(misc,4) ("[NET][G-List] cleared server list");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1548
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1549
item = _network_game_list;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1550
while (item != NULL) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1551
	next = (NetworkGameList *) item -> _next;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1552
	free (item);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1553
	item = next;
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
_network_game_list=NULL;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1556
_network_game_count=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1557
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1558
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1559
char * NetworkGameListAdd() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1560
NetworkGameList * item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1561
NetworkGameList * before; 
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1562
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1563
DEBUG(misc,4) ("[NET][G-List] added server to list");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1564
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1565
item = _network_game_list;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1566
before = item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1567
while (item != NULL) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1568
	before = item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1569
	item = (NetworkGameList *) item -> _next;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1570
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1571
item = malloc(sizeof(NetworkGameList));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1572
item -> _next = NULL;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1573
if (before == NULL) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1574
	_network_game_list = item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1575
	} else {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1576
	before -> _next = (char *) item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1577
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1578
_network_game_count++;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1579
return (char *) item;
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
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1582
void NetworkGameListFromLAN() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1583
	struct UDPPacket packet;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1584
	DEBUG(misc,2) ("[NET][G-List] searching server over lan");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1585
	NetworkGameListClear();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1586
	packet.command_check=packet.command_code=NET_UDPCMD_SERVERSEARCH;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1587
	packet.data_len=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1588
	NetworkUDPBroadCast(true,packet);
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
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1591
void NetworkGameListFromInternet() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1592
	DEBUG(misc,2) ("[NET][G-List] searching servers over internet");
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1593
	NetworkGameListClear();
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1594
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1595
	// **TODO** masterserver communication [internet protocol list]
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1596
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1597
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1598
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1599
char * NetworkGameListItem(uint16 index) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1600
NetworkGameList * item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1601
NetworkGameList * next; 
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1602
uint16 cnt = 0;
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
item = _network_game_list;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1605
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1606
while ((item != NULL) && (cnt != index)) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1607
	next = (NetworkGameList *) item -> _next;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1608
	item = next;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1609
	cnt++;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1610
	}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1611
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1612
return (char *) item;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1613
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1614
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1615
// *************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1616
// * Network Game Extensions * //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1617
// *************************** //
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1618
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1619
void NetworkGameFillDefaults() {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1620
	NetworkGameInfo * game = &_network_game;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1621
#if defined(WITH_REV)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1622
	extern char _openttd_revision[];
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1623
#endif
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
	DEBUG(misc,4) ("[NET][G-Info] setting defaults");
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
	ttd_strlcpy(game->server_name,"OpenTTD Game",13);
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1628
	game->game_password[0]='\0';
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1629
	game->map_name[0]='\0';
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1630
#if defined(WITH_REV)
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1631
	ttd_strlcpy(game->server_revision,_openttd_revision,strlen(_openttd_revision));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1632
#else
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1633
	ttd_strlcpy(game->server_revision,"norev000",strlen("norev000"));
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1634
#endif
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1635
	game->game_date=0;
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
	game->map_height=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1638
	game->map_width=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1639
	game->map_set=0;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1640
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1641
	game->players_max=8;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1642
	game->players_on=0;
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
	game->server_lang=_dynlang.curr;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1645
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1646
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1647
void NetworkGameChangeDate(uint16 newdate) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1648
	if (_networking_server) {
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1649
		_network_game.game_date = newdate;
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1650
		}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1651
}
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1652
8
9ab81ef450f2 (svn r9) Fixed a couple of warnings and minor coding issues
dominik
parents: 1
diff changeset
  1653
#else // not ENABLE_NETWORK
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1654
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1655
// stubs
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1656
void NetworkInitialize() {}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1657
void NetworkShutdown() {}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1658
void NetworkListen() {}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1659
void NetworkConnect(const char *hostname, int port) {}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1660
void NetworkReceive() {}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1661
void NetworkSend() {}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1662
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
  1663
void NetworkProcessCommands() {}
106
51354fbb3e8a (svn r107) Small fix for compiling without networking
dominik
parents: 105
diff changeset
  1664
void NetworkStartSync(bool fcreset) {}
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1665
void NetworkCoreInit() { _network_available=false; };
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1666
void NetworkCoreShutdown() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1667
void NetworkCoreDisconnect() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1668
void NetworkCoreLoop(bool incomming) {};
106
51354fbb3e8a (svn r107) Small fix for compiling without networking
dominik
parents: 105
diff changeset
  1669
bool NetworkCoreConnectGame(byte* b, unsigned short port) {return false;};
51354fbb3e8a (svn r107) Small fix for compiling without networking
dominik
parents: 105
diff changeset
  1670
bool NetworkCoreStartGame() {return false;};
105
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1671
void NetworkLobbyShutdown() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1672
void NetworkLobbyInit() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1673
void NetworkGameListClear() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1674
char * NetworkGameListAdd() {return NULL;};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1675
void NetworkGameListFromLAN() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1676
void NetworkGameListFromInternet() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1677
void NetworkGameFillDefaults() {};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1678
char * NetworkGameListItem(uint16 index) {return NULL;};
44e894da0fef (svn r106) New network core (by sign_de)
dominik
parents: 81
diff changeset
  1679
void NetworkGameChangeDate(uint16 newdate) {};
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
#endif