summaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'src/network')
-rw-r--r--src/network/network.cpp52
-rw-r--r--src/network/network.h11
-rw-r--r--src/network/network_data.cpp5
3 files changed, 68 insertions, 0 deletions
diff --git a/src/network/network.cpp b/src/network/network.cpp
index 52f6ddbb0..5b7ab937c 100644
--- a/src/network/network.cpp
+++ b/src/network/network.cpp
@@ -37,6 +37,7 @@
#include "../console.h" /* IConsoleCmdExec */
#include <stdarg.h> /* va_list */
#include "../md5.h"
+#include "../fileio.h"
/* Check whether NETWORK_NUM_LANDSCAPES is still in sync with NUM_LANDSCAPE */
assert_compile((int)NETWORK_NUM_LANDSCAPES == (int)NUM_LANDSCAPE);
@@ -195,6 +196,9 @@ void CDECL NetworkTextMessage(NetworkAction action, uint16 color, bool self_send
break;
}
+#ifdef DEBUG_DUMP_COMMANDS
+ debug_dump_commands("ddc:cmsg:%d;%d;%s\n", _date, _date_fract, message);
+#endif /* DUMP_COMMANDS */
IConsolePrintF(color, "%s", message);
AddTextMessage(color, duration, "%s", message);
}
@@ -1235,6 +1239,9 @@ static bool NetworkDoClientLoop()
if (_sync_seed_1 != _random_seeds[0][0]) {
#endif
NetworkError(STR_NETWORK_ERR_DESYNC);
+#ifdef DEBUG_DUMP_COMMANDS
+ debug_dump_commands("ddc:serr:%d;%d\n", _date, _date_fract);
+#endif /* DUMP_COMMANDS */
DEBUG(net, 0, "Sync error detected!");
NetworkClientError(NETWORK_RECV_STATUS_DESYNC, DEREF_CLIENT(0));
return false;
@@ -1280,6 +1287,37 @@ void NetworkGameLoop()
if (!NetworkReceive()) return;
if (_network_server) {
+#ifdef DEBUG_DUMP_COMMANDS
+ static FILE *f = FioFOpenFile("commands.log", "rb", SAVE_DIR);
+ static Date next_date = 0;
+ static uint32 next_date_fract;
+ static CommandPacket *cp = NULL;
+ if (f == NULL && next_date == 0) {
+ printf("Cannot open commands.log\n");
+ next_date = 1;
+ }
+
+ while (f != NULL && !feof(f)) {
+ if (cp != NULL && _date == next_date && _date_fract == next_date_fract) {
+ _current_player = cp->player;
+ _cmd_text = cp->text;
+ DoCommandP(cp->tile, cp->p1, cp->p2, NULL, cp->cmd);
+ free(cp);
+ cp = NULL;
+ }
+
+ if (cp != NULL) break;
+
+ char buff[4096];
+ if (fgets(buff, lengthof(buff), f) == NULL) break;
+ if (strncmp(buff, "ddc:cmd:", 8) != 0) continue;
+ cp = MallocT<CommandPacket>(1);
+ int player;
+ sscanf(&buff[8], "%d;%d;%d;%d;%d;%d;%d;%s", &next_date, &next_date_fract, &player, &cp->tile, &cp->p1, &cp->p2, &cp->cmd, cp->text);
+ cp->player = (Owner)player;
+ }
+#endif /* DUMP_COMMANDS */
+
bool send_frame = false;
// We first increase the _frame_counter
@@ -1436,4 +1474,18 @@ bool IsNetworkCompatibleVersion(const char *other)
strncmp(_openttd_revision, other, NETWORK_REVISION_LENGTH - 1) == 0;
}
+#ifdef DEBUG_DUMP_COMMANDS
+void CDECL debug_dump_commands(const char *s, ...)
+{
+ static FILE *f = FioFOpenFile("commands-out.log", "wb", SAVE_DIR);
+ if (f == NULL) return;
+
+ va_list va;
+ va_start(va, s);
+ vfprintf(f, s, va);
+ va_end(va);
+
+ fflush(f);
+}
+#endif /* DEBUG_DUMP_COMMANDS */
#endif /* ENABLE_NETWORK */
diff --git a/src/network/network.h b/src/network/network.h
index c20e9b3f8..9907716ac 100644
--- a/src/network/network.h
+++ b/src/network/network.h
@@ -20,6 +20,17 @@
// nothing will happen.
//#define ENABLE_NETWORK_SYNC_EVERY_FRAME
+/*
+ * Dumps all commands that are sent/received to stderr and saves every month.
+ * This log can become quite large over time; say in the order of two to three
+ * times the bandwidth used for network games.
+ */
+//#define DEBUG_DUMP_COMMANDS
+
+#ifdef DEBUG_DUMP_COMMANDS
+void CDECL debug_dump_commands(const char *s, ...);
+#endif /* DEBUG_DUMP_COMMANDS */
+
// In theory sending 1 of the 2 seeds is enough to check for desyncs
// so in theory, this next define can be left off.
//#define NETWORK_SEND_DOUBLE_SEED
diff --git a/src/network/network_data.cpp b/src/network/network_data.cpp
index 627d5bfbd..3e148cb43 100644
--- a/src/network/network_data.cpp
+++ b/src/network/network_data.cpp
@@ -97,6 +97,11 @@ void NetworkExecuteCommand(CommandPacket *cp)
DEBUG(net, 0, "Received out-of-bounds callback (%d)", cp->callback);
cp->callback = 0;
}
+
+#ifdef DEBUG_DUMP_COMMANDS
+ debug_dump_commands("ddc:cmd:%d;%d;%d;%d;%d;%d;%d;%s\n", _date, _date_fract, (int)cp->player, cp->tile, cp->p1, cp->p2, cp->cmd, cp->text);
+#endif /* DUMP_COMMANDS */
+
DoCommandP(cp->tile, cp->p1, cp->p2, _callback_table[cp->callback], cp->cmd | CMD_NETWORK_COMMAND);
}