Packet logging improvements

This commit is contained in:
Nick Renieris 2022-06-26 11:46:14 +03:00
parent 39c1ac40c0
commit d0aad34f43
4 changed files with 35 additions and 14 deletions

View File

@ -49,7 +49,14 @@ public class Client : IDisposable {
}
#if DEBUG
PacketUtils.LogPacket(packet, "SEND", Logger);
Guid senderId = sender?.Id ?? Id;
string senderName = "?";
Client? client = Server.FindExistingClient(senderId);
if (client is not null) {
senderName = client.Name;
}
PacketUtils.LogPacket(packet, $"{senderName} -> (server)");
#endif
await Socket!.SendAsync(memory.Memory[..(Constants.HeaderSize + packet.Size)], SocketFlags.None);

View File

@ -68,7 +68,6 @@ float MarioSize(bool is2d) => is2d ? 180 : 160;
server.PacketHandler = (c, p) => {
switch (p) {
case GamePacket gamePacket: {
c.Logger.Info($"Got game packet {gamePacket.Stage}->{gamePacket.ScenarioNum}");
c.Metadata["scenario"] = gamePacket.ScenarioNum;
c.Metadata["2d"] = gamePacket.Is2d;
c.Metadata["lastGamePacket"] = gamePacket;
@ -382,7 +381,7 @@ CommandHandler.RegisterCommand("maxplayers", args => {
});
CommandHandler.RegisterCommand("list",
_ => $"List: {string.Join("\n\t", server.Clients.Where(x => x.Connected).Select(x => $"{x.Name} ({x.Id})"))}");
_ => $"List: {string.Join("\n ", server.Clients.Where(x => x.Connected).Select(x => $"{x.Name} ({x.Id})"))}");
CommandHandler.RegisterCommand("flip", args => {
const string optionUsage =

View File

@ -80,14 +80,19 @@ public class Server {
FillPacket(header, packet, memory.Memory);
#if DEBUG
PacketUtils.LogPacket(packet, "BRDC", sender.Logger);
Guid senderId = sender?.Id ?? Guid.Empty;
string senderName = "?";
Client? client = FindExistingClient(senderId);
if (client != null)
senderName = client.Name;
PacketUtils.LogPacket(packet, $"{senderName} -> (all)");
#endif
await Broadcast(memory, sender);
}
public Task Broadcast<T>(T packet) where T : struct, IPacket {
#if DEBUG
PacketUtils.LogPacket(packet, "BRDC", Logger);
PacketUtils.LogPacket(packet, "BRDC");
#endif
return Task.WhenAll(Clients.Where(c => c.Connected).Select(async client => {
@ -250,7 +255,7 @@ public class Server {
};
connectPacket.Serialize(tempBuffer.Memory.Span[Constants.HeaderSize..]);
#if DEBUG
PacketUtils.LogPacket(connectPacket, "SEND", Logger);
PacketUtils.LogPacket(connectPacket, $"{client.Name} -> {other.Name}");
#endif
await client.Send(tempBuffer.Memory[..(Constants.HeaderSize + connect.Size)], null);
if (other.CurrentCostume.HasValue) {
@ -259,7 +264,7 @@ public class Server {
connectHeader.Serialize(tempBuffer.Memory.Span[..Constants.HeaderSize]);
other.CurrentCostume.Value.Serialize(tempBuffer.Memory.Span[Constants.HeaderSize..(Constants.HeaderSize + connectHeader.PacketSize)]);
#if DEBUG
PacketUtils.LogPacket((CostumePacket)other.CurrentCostume, "SEND", Logger);
PacketUtils.LogPacket((CostumePacket)other.CurrentCostume, $"{client.Name} -> {other.Name}");
#endif
await client.Send(tempBuffer.Memory[..(Constants.HeaderSize + connectHeader.PacketSize)], null);
}
@ -269,7 +274,7 @@ public class Server {
Logger.Info($"Client {client.Name} ({client.Id}/{socket.RemoteEndPoint}) connected.");
} else if (header.Id != client.Id && client.Id != Guid.Empty) {
throw new Exception($"Client {client.Name} sent packet with invalid client id {header.Id} instead of {client.Id}");
throw new Exception($"Client {client.Name} sent packet {header.Type} with invalid client id {header.Id} instead of {client.Id}");
}
if (header.Type == PacketType.Costume) {
@ -285,7 +290,7 @@ public class Server {
packet.Deserialize(memory.Memory.Span[Constants.HeaderSize..(Constants.HeaderSize + packet.Size)]);
#if DEBUG
PacketUtils.LogPacket(packet, "RECV", client.Logger);
PacketUtils.LogPacket(packet, $"{FindExistingClient(header.Id)!.Name} -> (server)");
#endif
if (PacketHandler?.Invoke(client, packet) is false) {
@ -299,7 +304,7 @@ public class Server {
#if DEBUG
if (header.Type is not (PacketType.Player or PacketType.Cap)) {
Logger.Debug("[BRDC] last");
PacketUtils.LogPacketSame($"{client.Name} -> (all)");
}
#endif

View File

@ -20,18 +20,28 @@ public static class PacketUtils {
return Constants.HeaderSize + Marshal.SizeOf<T>();
}
public static void LogPacket<T>(T packet, string direction, Logger logger) where T : IPacket {
public static void LogPacket<T>(T packet, string tag) where T : IPacket {
if (packet is PlayerPacket or CapPacket) // These are too spammy
return;
Type packetType = packet.GetType();
FieldInfo[] fields = packetType.GetFields();
logger.Debug($"[{direction}] {packetType.Name} {{");
string prefix = $"{{{DateTime.Now}}} Debug";
string msg = $"{prefix} [{tag}] {packetType.Name} {{\n";
foreach (FieldInfo field in fields)
{
logger.Debug($"\t{field.Name} = {field.GetValue(packet)}");
msg += $"{prefix} {field.Name} = {field.GetValue(packet)}\n";
}
logger.Debug($"}}");
Console.ForegroundColor = ConsoleColor.White;
Console.Write(msg);
}
public static void LogPacketSame(string tag) {
string prefix = $"{{{DateTime.Now}}} Debug";
string msg = $"{prefix} [{tag}] {{same}}\n";
Console.ForegroundColor = ConsoleColor.White;
Console.Write(msg);
}
}