diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index b373fa1f..18841388 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -15,8 +15,11 @@ packetqueue pkglogger(8); void neterr(const char *s) { conoutf("\f3illegal network message (%s)", s); + + // might indicate a client/server communication bug, create error report pkglogger.flushtolog("packetlog.txt"); - conoutf("\f3wrote network error report to packetlog.txt, please post this file to the bugtracker now!"); + conoutf("\f3wrote a network error report to packetlog.txt, please post this file to the bugtracker now!"); + disconnect(); } diff --git a/source/src/packetqueue.cpp b/source/src/packetqueue.cpp new file mode 100644 index 00000000..f9091205 --- /dev/null +++ b/source/src/packetqueue.cpp @@ -0,0 +1,65 @@ +// supports buffering Enet packets for logging purposes + +#include "pch.h" +#include "cube.h" + +packetqueue::packetqueue(size_t size) +{ + queuesize = size; +} + +packetqueue::~packetqueue() +{ + clear(); +} + +// adds packet to log buffer +void packetqueue::queue(ENetPacket &p) +{ + // add to back + pqueue.push(p); + // drop oldest packet to fit size + if(pqueue.size() > queuesize) pqueue.pop(); +} + +// writes all currently queued packets to disk and clears the queue +bool packetqueue::flushtolog(char *logfile ) +{ + if(pqueue.empty()) return false; + + FILE *f = NULL; + if(logfile && logfile[0]) f = openfile(logfile, "w"); + if(!f) return false; + + // header + fprintf(f, "AC PACKET LOG %11d\n\n", now_utc); + // serialize each packet + while(!pqueue.empty()) + { + ENetPacket packet = pqueue.front(); + + fputs("ENET PACKET\n", f); + fprintf(f, "flags == %d\n", packet.flags); + fprintf(f, "referenceCount == %d\n", packet.referenceCount); + fprintf(f, "dataLength == %d\n", packet.dataLength); + fputs("data == \n", f); + // print whole buffer char-wise + loopi(packet.dataLength) + { + fprintf(f, "%16d\n", packet.data[i]); + } + + pqueue.pop(); + } + + fclose(f); + clear(); + return true; +} + +// clear queue +void packetqueue::clear() +{ + while(!pqueue.empty()) pqueue.pop(); +} +