Browse Source

Better handling of 1st byte.

Dominique Louis 3 tuần trước cách đây
mục cha
commit
6f1397b3c6
1 tập tin đã thay đổi với 33 bổ sung9 xóa
  1. 33 9
      MonoGame.Xna.Framework.Net/Net/NetworkSession.cs

+ 33 - 9
MonoGame.Xna.Framework.Net/Net/NetworkSession.cs

@@ -893,24 +893,48 @@ namespace Microsoft.Xna.Framework.Net
                     var (data, senderEndpoint) = await networkTransport.ReceiveAsync();
                     if (data.Length > 0)
                     {
+                        // Identify sender by endpoint mapping
                         NetworkGamer senderGamer = null;
                         lock (lockObject)
                         {
                             senderGamer = gamers.FirstOrDefault(g => gamerEndpoints.TryGetValue(g.Id, out var ep) && ep.Equals(senderEndpoint));
                         }
 
-                        if (senderGamer != null)
+                        // Inspect the first byte to see if this is a registered (framework) message
+                        byte typeId = data[0];
+                        var registered = NetworkMessageRegistry.CreateMessage(typeId);
+
+                        bool handledFramework = false;
+                        if (registered != null)
                         {
-                            // Deliver to the local gamer’s inbox with correct sender, matching XNA ReceiveData semantics
-                            NetworkGamer.LocalGamer?.EnqueueIncomingPacket(data, senderGamer);
+                            // Try to deserialize as a framework message; if it doesn't fully parse,
+                            // fall back to treating as application payload.
+                            try
+                            {
+                                var reader = new PacketReader(data);
+                                reader.ReadByte(); // consume type id
+                                registered.Deserialize(reader);
+                                // Consider it framework only if we've consumed the full payload
+                                if (reader.BytesRemaining == 0)
+                                {
+                                    OnMessageReceived(new MessageReceivedEventArgs(registered, senderEndpoint));
+                                    handledFramework = true;
+                                }
+                            }
+                            catch
+                            {
+                                handledFramework = false;
+                            }
                         }
 
-                        // Parse message: first byte is the type id
-                        var reader = new PacketReader(data);
-                        var typeId = reader.ReadByte();
-                        var message = NetworkMessageRegistry.CreateMessage(typeId);
-                        message?.Deserialize(reader);
-                        OnMessageReceived(new MessageReceivedEventArgs(message, senderEndpoint));
+                        if (!handledFramework)
+                        {
+                            // Application payload. Enqueue for LocalGamer.ReceiveData
+                            if (senderGamer != null)
+                            {
+                                NetworkGamer.LocalGamer?.EnqueueIncomingPacket(data, senderGamer);
+                            }
+                        }
                     }
                 }
                 catch (ObjectDisposedException) { break; }