summaryrefslogtreecommitdiff
path: root/network.c
diff options
context:
space:
mode:
authordarkvater <darkvater@openttd.org>2004-09-12 14:12:33 +0000
committerdarkvater <darkvater@openttd.org>2004-09-12 14:12:33 +0000
commit24512d3da5ffef6e741c4ebf4e381a2ecab56dc1 (patch)
tree939d8687576f1b23c0590d67aa154929e0b730d6 /network.c
parent7a6512a6543feff0b551f3ac3cdfe356bc0e4daf (diff)
downloadopenttd-24512d3da5ffef6e741c4ebf4e381a2ecab56dc1.tar.xz
(svn r212) -Fix: Network-gui fixes (sign_de)
-Fix: any disabled button in a window doesn't receive WE_CLICK events -Added network.h
Diffstat (limited to 'network.c')
-rw-r--r--network.c365
1 files changed, 177 insertions, 188 deletions
diff --git a/network.c b/network.c
index 3b8407e15..27f2d3065 100644
--- a/network.c
+++ b/network.c
@@ -246,31 +246,6 @@ static size_t _transmit_file_size;
static FILE *_recv_file;
-typedef struct NetworkGameInfo {
- char server_name[40]; // name of the game
- char server_revision[8]; // server game version
- byte server_lang; // langid
- byte players_max; // max players allowed on server
- byte players_on; // current count of players on server
- uint16 game_date; // current date
- char game_password[10]; // should fit ... 10 chars
- char map_name[40]; // map which is played ["random" for a randomized map]
- uint map_width; // map width / 8
- uint map_height; // map height / 8
- byte map_set; // graphical set
-} NetworkGameInfo;
-
-typedef struct NetworkGameList {
- NetworkGameInfo item;
- uint32 ip;
- uint16 port;
- char * _next;
-} NetworkGameList;
-
-static NetworkGameInfo _network_game;
-static NetworkGameList * _network_game_list = NULL;
-
-
/* multi os compatible sleep function */
void CSleep(int milliseconds) {
#if defined(WIN32)
@@ -327,6 +302,7 @@ static void NetworkHandleConnectionLost()
_switch_mode = SM_MENU;
_switch_mode_errorstr = STR_NETWORK_ERR_LOSTCONNECTION;
}
+
static void NetworkHandleDeSync()
{
DEBUG(net, 0) ("[NET] Fatal ERROR: network sync error at frame %i", _frame_counter);
@@ -354,7 +330,8 @@ static QueuedCommand *AllocQueuedCommand(CommandQueue *nq)
return qp;
}
-static void QueueClear(CommandQueue *nq) {
+static void QueueClear(CommandQueue *nq)
+{
QueuedCommand *qp;
while ((qp=nq->head)) {
// unlink it.
@@ -676,7 +653,8 @@ static void HandleFilePacket(FilePacketHdr *fp)
}
}
-static void HandleWelcomePacket(WelcomePacket *wp) {
+static void HandleWelcomePacket(WelcomePacket *wp)
+{
int i;
for (i=0; i<MAX_PLAYERS; i++) {
_player_seeds[i][0]=wp->player_seeds[i][0];
@@ -1036,7 +1014,6 @@ static void NetworkAcceptClients()
// * sync - games are in sync
}
-
static void SendQueuedCommandsToNewClient(ClientState *cs)
{
// send the commands in the server queue to the new client.
@@ -1072,8 +1049,8 @@ static void SendQueuedCommandsToNewClient(ClientState *cs)
}
-
-bool NetworkCheckClientReady() {
+bool NetworkCheckClientReady()
+{
bool ready_all = true;
uint16 count = 0;
ClientState *cs;
@@ -1095,7 +1072,8 @@ bool NetworkCheckClientReady() {
// * TCP Networking * //
// ************************** //
-unsigned long NetworkResolveHost(const char *hostname) {
+unsigned long NetworkResolveHost(const char *hostname)
+{
struct hostent* remotehost;
if ((hostname[0]<0x30) || (hostname[0]>0x39)) {
@@ -1291,6 +1269,7 @@ void NetworkInitialize()
QueueClear(&_command_queue);
QueueClear(&_ack_queue);
_command_queue.last = &_command_queue.head;
+ _network_game_list = NULL;
// invalidate all clients
for(cs=_clients; cs != &_clients[MAX_CLIENTS]; cs++)
@@ -1298,7 +1277,8 @@ void NetworkInitialize()
}
-void NetworkClose(bool client) {
+void NetworkClose(bool client)
+{
ClientState *cs;
// invalidate all clients
@@ -1312,7 +1292,7 @@ void NetworkClose(bool client) {
closesocket(_listensocket);
_listensocket= INVALID_SOCKET;
DEBUG(net, 1) ("[NET][TCP] closed listener on port %i", _network_server_port);
- }
+ }
}
void NetworkShutdown()
@@ -1331,6 +1311,7 @@ void NetworkStartSync(bool fcreset)
DEBUG(net, 3) ("[NET][SYNC] switching to synced game mode");
_networking_sync = true;
_frame_counter = 0;
+
if (fcreset) {
_frame_counter_max = 0;
_frame_counter_srv = 0;
@@ -1339,22 +1320,23 @@ void NetworkStartSync(bool fcreset)
_num_future_seed = 0;
_sync_seed_1 = _sync_seed_2 = 0;
memset(_my_seed_list, 0, sizeof(_my_seed_list));
-
}
// ********************************* //
// * Network Core Console Commands * //
// ********************************* //
-static _iconsole_var * NetworkConsoleCmdConnect(byte argc, byte* argv[], byte argt[]) {
+static _iconsole_var * NetworkConsoleCmdConnect(byte argc, byte* argv[], byte argt[])
+{
if (argc<2) return NULL;
- if (argc==2) {
+
+ if (argc == 2) {
IConsolePrintF(_iconsole_color_default, "connecting to %s",argv[1]);
NetworkCoreConnectGame(argv[1],_network_server_port);
- } else if (argc==3) {
+ } else if (argc == 3) {
IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s",argv[1],argv[2]);
NetworkCoreConnectGame(argv[1],atoi(argv[2]));
- } else if (argc==4) {
+ } else if (argc == 4) {
IConsolePrintF(_iconsole_color_default, "connecting to %s on port %s as player %s",argv[1],argv[2],argv[3]);
_network_playas = atoi(argv[3]);
NetworkCoreConnectGame(argv[1],atoi(argv[2]));
@@ -1401,7 +1383,8 @@ void NetworkUDPListen(bool client)
}
-void NetworkUDPClose(bool client) {
+void NetworkUDPClose(bool client)
+{
if (client) {
DEBUG(net, 1) ("[NET][UDP] closed listener on port %i", _network_client_port);
closesocket(_udp_client_socket);
@@ -1413,7 +1396,8 @@ void NetworkUDPClose(bool client) {
};
}
-void NetworkUDPReceive(bool client) {
+void NetworkUDPReceive(bool client)
+{
struct sockaddr_in client_addr;
#ifndef __MORPHOS__
int client_len;
@@ -1465,9 +1449,8 @@ void NetworkUDPReceive(bool client) {
}
}
-
-
-void NetworkUDPBroadCast(bool client, struct UDPPacket packet) {
+void NetworkUDPBroadCast(bool client, struct UDPPacket packet)
+{
int i=0, res;
struct sockaddr_in out_addr;
uint32 bcaddr;
@@ -1490,8 +1473,8 @@ void NetworkUDPBroadCast(bool client, struct UDPPacket packet) {
}
-void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet) {
-
+void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet)
+{
SOCKET udp;
if (client) udp=_udp_client_socket; else udp=_udp_server_socket;
@@ -1499,7 +1482,8 @@ void NetworkUDPSend(bool client, struct sockaddr_in recv,struct UDPPacket packet
}
-bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport) {
+bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned short * _network_detected_serverport)
+{
struct UDPPacket packet;
int timeout=3000;
@@ -1537,7 +1521,8 @@ bool NetworkUDPSearchGame(const byte ** _network_detected_serverip, unsigned sho
// * New Network Core System * //
// *************************** //
-void NetworkIPListInit() {
+void NetworkIPListInit()
+{
struct hostent* he = NULL;
char hostname[250];
uint32 bcaddr;
@@ -1573,103 +1558,98 @@ void NetworkIPListInit() {
/* *************************************************** */
-void NetworkCoreInit() {
-
-DEBUG(net, 3) ("[NET][Core] init()");
-_network_available=true;
-_network_client_timeout=300;
+void NetworkCoreInit()
+{
+ DEBUG(net, 3) ("[NET][Core] init()");
+ _network_available=true;
+ _network_client_timeout=300;
-// [win32] winsock startup
+ // [win32] winsock startup
-#if defined(WIN32)
-{
- WSADATA wsa;
- DEBUG(net, 3) ("[NET][Core] using windows socket library");
- if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) {
- DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed");
- _network_available=false;
- }
-}
-#else
+ #if defined(WIN32)
+ {
+ WSADATA wsa;
+ DEBUG(net, 3) ("[NET][Core] using windows socket library");
+ if (WSAStartup(MAKEWORD(2,0), &wsa) != 0) {
+ DEBUG(net, 3) ("[NET][Core] error: WSAStartup failed");
+ _network_available=false;
+ }
+ }
+ #else
-// [morphos/amigaos] bsd-socket startup
+ // [morphos/amigaos] bsd-socket startup
-#if defined(__MORPHOS__) || defined(__AMIGA__)
-{
- DEBUG(misc,3) ("[NET][Core] using bsd socket library");
- if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
- DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
- _network_available=false;
- }
+ #if defined(__MORPHOS__) || defined(__AMIGA__)
+ {
+ DEBUG(misc,3) ("[NET][Core] using bsd socket library");
+ if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) {
+ DEBUG(net, 3) ("[NET][Core] Couldn't open bsdsocket.library version 4.");
+ _network_available=false;
+ }
- #if !defined(__MORPHOS__)
- // for usleep() implementation (only required for legacy AmigaOS builds)
- if ( (TimerPort = CreateMsgPort()) ) {
- if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) {
- if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) {
- if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) {
- // free ressources...
- DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer.");
- _network_available=false;
+ #if !defined(__MORPHOS__)
+ // for usleep() implementation (only required for legacy AmigaOS builds)
+ if ( (TimerPort = CreateMsgPort()) ) {
+ if ( (TimerRequest = (struct timerequest *) CreateIORequest(TimerPort, sizeof(struct timerequest))) ) {
+ if ( OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *) TimerRequest, 0) == 0 ) {
+ if ( !(TimerBase = TimerRequest->tr_node.io_Device) ) {
+ // free ressources...
+ DEBUG(net, 3) ("[NET][Core] Couldn't initialize timer.");
+ _network_available=false;
+ }
}
}
}
- }
- #endif
+ #endif
-}
-#else
+ }
+ #else
-// [linux/macos] unix-socket startup
+ // [linux/macos] unix-socket startup
- DEBUG(net, 3) ("[NET][Core] using unix socket library");
+ DEBUG(net, 3) ("[NET][Core] using unix socket library");
-#endif
+ #endif
-#endif
+ #endif
-if (_network_available) {
- DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
- // initiate network ip list
- NetworkIPListInit();
- IConsoleCmdRegister("connect",NetworkConsoleCmdConnect);
- IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16);
- IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16);
- IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16);
- } else {
- DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
- }
+ if (_network_available) {
+ DEBUG(net, 3) ("[NET][Core] OK: multiplayer available");
+ // initiate network ip list
+ NetworkIPListInit();
+ IConsoleCmdRegister("connect",NetworkConsoleCmdConnect);
+ IConsoleVarRegister("net_client_timeout",&_network_client_timeout,ICONSOLE_VAR_UINT16);
+ IConsoleVarRegister("net_ready_ahead",&_network_ready_ahead,ICONSOLE_VAR_UINT16);
+ IConsoleVarRegister("net_sync_freq",&_network_sync_freq,ICONSOLE_VAR_UINT16);
+ } else
+ DEBUG(net, 3) ("[NET][Core] FAILED: multiplayer not available");
}
/* *************************************************** */
-void NetworkCoreShutdown() {
-
-DEBUG(net, 3) ("[NET][Core] shutdown()");
-
-#if defined(__MORPHOS__) || defined(__AMIGA__)
+void NetworkCoreShutdown()
{
- // free allocated ressources
- #if !defined(__MORPHOS__)
- if (TimerBase) { CloseDevice((struct IORequest *) TimerRequest); }
- if (TimerRequest) { DeleteIORequest(TimerRequest); }
- if (TimerPort) { DeleteMsgPort(TimerPort); }
- #endif
+ DEBUG(net, 3) ("[NET][Core] shutdown()");
- if (SocketBase) {
- CloseLibrary(SocketBase);
+ #if defined(__MORPHOS__) || defined(__AMIGA__)
+ {
+ // free allocated ressources
+ #if !defined(__MORPHOS__)
+ if (TimerBase) { CloseDevice((struct IORequest *) TimerRequest); }
+ if (TimerRequest) { DeleteIORequest(TimerRequest); }
+ if (TimerPort) { DeleteMsgPort(TimerPort); }
+ #endif
+
+ if (SocketBase) {
+ CloseLibrary(SocketBase);
+ }
}
-}
-#endif
-
-
-#if defined(WIN32)
-{
- WSACleanup();
-}
-#endif
+ #endif
+ #if defined(WIN32)
+ { WSACleanup();}
+ #endif
}
/* *************************************************** */
@@ -1707,6 +1687,13 @@ bool NetworkCoreConnectGame(const byte* b, unsigned short port)
/* *************************************************** */
+bool NetworkCoreConnectGameStruct(NetworkGameList * item)
+{
+ return NetworkCoreConnectGame(inet_ntoa(*(struct in_addr *) &item->ip),item->port);
+}
+
+/* *************************************************** */
+
bool NetworkCoreStartGame()
{
if (!_network_available) return false;
@@ -1741,39 +1728,33 @@ void NetworkCoreDisconnect()
/* *************************************************** */
-void NetworkCoreLoop(bool incomming) {
-
-
-if (incomming) {
-
- // incomming
+void NetworkCoreLoop(bool incomming)
+{
+ if (incomming) {
+ // incomming
+ if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
+ if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
- if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
- if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
-
- if (_networking) {
- NetworkReceive();
- }
+ if (_networking)
+ NetworkReceive();
} else {
+ if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
+ if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
- if ( _udp_client_socket != INVALID_SOCKET ) NetworkUDPReceive(true);
- if ( _udp_server_socket != INVALID_SOCKET ) NetworkUDPReceive(false);
-
- if (_networking) {
- NetworkSend();
- }
-
+ if (_networking)
+ NetworkSend();
}
-
}
-void NetworkLobbyInit() {
+void NetworkLobbyInit()
+{
DEBUG(net, 3) ("[NET][Lobby] init()");
NetworkUDPListen(true);
}
-void NetworkLobbyShutdown() {
+void NetworkLobbyShutdown()
+{
DEBUG(net, 3) ("[NET][Lobby] shutdown()");
NetworkUDPClose(true);
}
@@ -1783,46 +1764,52 @@ void NetworkLobbyShutdown() {
// * Network Game List Extensions * //
// ******************************** //
-void NetworkGameListClear() {
-NetworkGameList * item;
-NetworkGameList * next;
+void NetworkGameListClear()
+{
+ NetworkGameList * item;
+ NetworkGameList * next;
+
+ DEBUG(net, 4) ("[NET][G-List] cleared server list");
-DEBUG(net, 4) ("[NET][G-List] cleared server list");
+ item = _network_game_list;
-item = _network_game_list;
-while (item != NULL) {
- next = (NetworkGameList *) item -> _next;
- free (item);
- item = next;
+ while (item != NULL) {
+ next = (NetworkGameList *) item -> _next;
+ free (item);
+ item = next;
}
-_network_game_list=NULL;
-_network_game_count=0;
+ _network_game_list=NULL;
+ _network_game_count=0;
}
-char * NetworkGameListAdd() {
-NetworkGameList * item;
-NetworkGameList * before;
+NetworkGameList * NetworkGameListAdd()
+{
+ NetworkGameList * item;
+ NetworkGameList * before;
-DEBUG(net, 4) ("[NET][G-List] added server to list");
+ DEBUG(net, 4) ("[NET][G-List] added server to list");
-item = _network_game_list;
-before = item;
-while (item != NULL) {
+ item = _network_game_list;
before = item;
- item = (NetworkGameList *) item -> _next;
+ while (item != NULL) {
+ before = item;
+ item = (NetworkGameList *) item -> _next;
}
-item = malloc(sizeof(NetworkGameList));
-item -> _next = NULL;
-if (before == NULL) {
- _network_game_list = item;
- } else {
- before -> _next = (char *) item;
- }
-_network_game_count++;
-return (char *) item;
+
+ item = malloc(sizeof(NetworkGameList));
+ item -> _next = NULL;
+
+ if (before == NULL) {
+ _network_game_list = item;
+ } else
+ before -> _next = item;
+
+ _network_game_count++;
+ return item;
}
-void NetworkGameListFromLAN() {
+void NetworkGameListFromLAN()
+{
struct UDPPacket packet;
DEBUG(net, 2) ("[NET][G-List] searching server over lan");
NetworkGameListClear();
@@ -1831,35 +1818,37 @@ void NetworkGameListFromLAN() {
NetworkUDPBroadCast(true,packet);
}
-void NetworkGameListFromInternet() {
+void NetworkGameListFromInternet()
+{
DEBUG(net, 2) ("[NET][G-List] searching servers over internet");
NetworkGameListClear();
// **TODO** masterserver communication [internet protocol list]
-
}
-char * NetworkGameListItem(uint16 index) {
-NetworkGameList * item;
-NetworkGameList * next;
-uint16 cnt = 0;
+NetworkGameList * NetworkGameListItem(uint16 index)
+{
+ NetworkGameList * item;
+ NetworkGameList * next;
+ uint16 cnt = 0;
-item = _network_game_list;
+ item = _network_game_list;
-while ((item != NULL) && (cnt != index)) {
- next = (NetworkGameList *) item -> _next;
- item = next;
- cnt++;
+ while ((item != NULL) && (cnt != index)) {
+ next = (NetworkGameList *) item -> _next;
+ item = next;
+ cnt++;
}
-return (char *) item;
+ return item;
}
// *************************** //
// * Network Game Extensions * //
// *************************** //
-void NetworkGameFillDefaults() {
+void NetworkGameFillDefaults()
+{
NetworkGameInfo * game = &_network_game;
#if defined(WITH_REV)
extern char _openttd_revision[];
@@ -1887,10 +1876,10 @@ void NetworkGameFillDefaults() {
game->server_lang=_dynlang.curr;
}
-void NetworkGameChangeDate(uint16 newdate) {
- if (_networking_server) {
+void NetworkGameChangeDate(uint16 newdate)
+{
+ if (_networking_server)
_network_game.game_date = newdate;
- }
}
#else // not ENABLE_NETWORK