Server LuaCsForBarotrauma
MessageFragmenter.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Collections.Immutable;
4 
5 namespace Barotrauma.Networking;
6 
7 sealed class MessageFragmenter
8 {
9  private UInt16 nextFragmentedMessageId = 0;
10  private readonly List<MessageFragment> fragments = new List<MessageFragment>();
11 
12  public ImmutableArray<MessageFragment> FragmentMessage(ReadOnlySpan<byte> bytes)
13  {
14  UInt16 msgId = nextFragmentedMessageId;
15  nextFragmentedMessageId++;
16 
17  int roundedByteCount = bytes.Length;
18  roundedByteCount += (MessageFragment.MaxSize - (roundedByteCount % MessageFragment.MaxSize)) % MessageFragment.MaxSize;
19 
20  int fragmentCount = roundedByteCount / MessageFragment.MaxSize;
21  fragments.Clear();
22  fragments.EnsureCapacity(fragmentCount);
23  for (int i = 0; i < fragmentCount; i++)
24  {
25  var subset = bytes[(i * MessageFragment.MaxSize)..];
26  if (subset.Length > MessageFragment.MaxSize) { subset = subset[..MessageFragment.MaxSize]; }
27 
28  fragments.Add(new MessageFragment(
29  FragmentId: new MessageFragment.Id(
30  FragmentIndex: (ushort)i,
31  FragmentCount: (ushort)fragmentCount,
32  MessageId: msgId),
33  Data: subset.ToArray().ToImmutableArray()));
34  }
35 
36  return fragments.ToImmutableArray();
37  }
38 }
ImmutableArray< MessageFragment > FragmentMessage(ReadOnlySpan< byte > bytes)