Files
Dec2017-Script-Dump/UnityEngine.Networking/ChannelBuffer.cs
T
2026-06-04 11:42:34 +02:00

472 lines
13 KiB
C#

using System;
using System.Collections.Generic;
namespace UnityEngine.Networking
{
// Token: 0x02000002 RID: 2
internal class ChannelBuffer : IDisposable
{
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
public ChannelBuffer(NetworkConnection conn, int bufferSize, byte cid, bool isReliable, bool isSequenced)
{
this.m_Connection = conn;
this.m_MaxPacketSize = bufferSize - 100;
this.m_CurrentPacket = new ChannelPacket(this.m_MaxPacketSize, isReliable);
this.m_ChannelId = cid;
this.m_MaxPendingPacketCount = 16;
this.m_IsReliable = isReliable;
this.m_AllowFragmentation = isReliable && isSequenced;
if (isReliable)
{
this.m_PendingPackets = new Queue<ChannelPacket>();
if (ChannelBuffer.s_FreePackets == null)
{
ChannelBuffer.s_FreePackets = new List<ChannelPacket>();
}
}
}
// Token: 0x17000001 RID: 1
// (get) Token: 0x06000002 RID: 2 RVA: 0x00002104 File Offset: 0x00000304
// (set) Token: 0x06000003 RID: 3 RVA: 0x0000211E File Offset: 0x0000031E
public int numMsgsOut { get; private set; }
// Token: 0x17000002 RID: 2
// (get) Token: 0x06000004 RID: 4 RVA: 0x00002128 File Offset: 0x00000328
// (set) Token: 0x06000005 RID: 5 RVA: 0x00002142 File Offset: 0x00000342
public int numBufferedMsgsOut { get; private set; }
// Token: 0x17000003 RID: 3
// (get) Token: 0x06000006 RID: 6 RVA: 0x0000214C File Offset: 0x0000034C
// (set) Token: 0x06000007 RID: 7 RVA: 0x00002166 File Offset: 0x00000366
public int numBytesOut { get; private set; }
// Token: 0x17000004 RID: 4
// (get) Token: 0x06000008 RID: 8 RVA: 0x00002170 File Offset: 0x00000370
// (set) Token: 0x06000009 RID: 9 RVA: 0x0000218A File Offset: 0x0000038A
public int numMsgsIn { get; private set; }
// Token: 0x17000005 RID: 5
// (get) Token: 0x0600000A RID: 10 RVA: 0x00002194 File Offset: 0x00000394
// (set) Token: 0x0600000B RID: 11 RVA: 0x000021AE File Offset: 0x000003AE
public int numBytesIn { get; private set; }
// Token: 0x17000006 RID: 6
// (get) Token: 0x0600000C RID: 12 RVA: 0x000021B8 File Offset: 0x000003B8
// (set) Token: 0x0600000D RID: 13 RVA: 0x000021D2 File Offset: 0x000003D2
public int numBufferedPerSecond { get; private set; }
// Token: 0x17000007 RID: 7
// (get) Token: 0x0600000E RID: 14 RVA: 0x000021DC File Offset: 0x000003DC
// (set) Token: 0x0600000F RID: 15 RVA: 0x000021F6 File Offset: 0x000003F6
public int lastBufferedPerSecond { get; private set; }
// Token: 0x06000010 RID: 16 RVA: 0x000021FF File Offset: 0x000003FF
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
// Token: 0x06000011 RID: 17 RVA: 0x00002210 File Offset: 0x00000410
protected virtual void Dispose(bool disposing)
{
if (!this.m_Disposed)
{
if (disposing)
{
if (this.m_PendingPackets != null)
{
while (this.m_PendingPackets.Count > 0)
{
ChannelBuffer.pendingPacketCount--;
ChannelPacket channelPacket = this.m_PendingPackets.Dequeue();
if (ChannelBuffer.s_FreePackets.Count < 512)
{
ChannelBuffer.s_FreePackets.Add(channelPacket);
}
}
this.m_PendingPackets.Clear();
}
}
}
this.m_Disposed = true;
}
// Token: 0x06000012 RID: 18 RVA: 0x000022A4 File Offset: 0x000004A4
public bool SetOption(ChannelOption option, int value)
{
bool flag;
if (option != ChannelOption.MaxPendingBuffers)
{
if (option != ChannelOption.AllowFragmentation)
{
if (option != ChannelOption.MaxPacketSize)
{
flag = false;
}
else if (!this.m_CurrentPacket.IsEmpty() || this.m_PendingPackets.Count > 0)
{
if (LogFilter.logError)
{
Debug.LogError("Cannot set MaxPacketSize after sending data.");
}
flag = false;
}
else if (value <= 0)
{
if (LogFilter.logError)
{
Debug.LogError("Cannot set MaxPacketSize less than one.");
}
flag = false;
}
else if (value > this.m_MaxPacketSize)
{
if (LogFilter.logError)
{
Debug.LogError("Cannot set MaxPacketSize to greater than the existing maximum (" + this.m_MaxPacketSize + ").");
}
flag = false;
}
else
{
this.m_CurrentPacket = new ChannelPacket(value, this.m_IsReliable);
this.m_MaxPacketSize = value;
flag = true;
}
}
else
{
this.m_AllowFragmentation = value != 0;
flag = true;
}
}
else if (!this.m_IsReliable)
{
flag = false;
}
else if (value < 0 || value >= 512)
{
if (LogFilter.logError)
{
Debug.LogError(string.Concat(new object[] { "Invalid MaxPendingBuffers for channel ", this.m_ChannelId, ". Must be greater than zero and less than ", 512 }));
}
flag = false;
}
else
{
this.m_MaxPendingPacketCount = value;
flag = true;
}
return flag;
}
// Token: 0x06000013 RID: 19 RVA: 0x00002430 File Offset: 0x00000630
public void CheckInternalBuffer()
{
if (Time.realtimeSinceStartup - this.m_LastFlushTime > this.maxDelay && !this.m_CurrentPacket.IsEmpty())
{
this.SendInternalBuffer();
this.m_LastFlushTime = Time.realtimeSinceStartup;
}
if (Time.realtimeSinceStartup - this.m_LastBufferedMessageCountTimer > 1f)
{
this.lastBufferedPerSecond = this.numBufferedPerSecond;
this.numBufferedPerSecond = 0;
this.m_LastBufferedMessageCountTimer = Time.realtimeSinceStartup;
}
}
// Token: 0x06000014 RID: 20 RVA: 0x000024B0 File Offset: 0x000006B0
public bool SendWriter(NetworkWriter writer)
{
return this.SendBytes(writer.AsArraySegment().Array, writer.AsArraySegment().Count);
}
// Token: 0x06000015 RID: 21 RVA: 0x000024E8 File Offset: 0x000006E8
public bool Send(short msgType, MessageBase msg)
{
ChannelBuffer.s_SendWriter.StartMessage(msgType);
msg.Serialize(ChannelBuffer.s_SendWriter);
ChannelBuffer.s_SendWriter.FinishMessage();
this.numMsgsOut++;
return this.SendWriter(ChannelBuffer.s_SendWriter);
}
// Token: 0x06000016 RID: 22 RVA: 0x00002538 File Offset: 0x00000738
internal bool HandleFragment(NetworkReader reader)
{
bool flag;
if (reader.ReadByte() == 0)
{
if (!this.readingFragment)
{
this.fragmentBuffer.SeekZero();
this.readingFragment = true;
}
byte[] array = reader.ReadBytesAndSize();
this.fragmentBuffer.WriteBytes(array, (ushort)array.Length);
flag = false;
}
else
{
this.readingFragment = false;
flag = true;
}
return flag;
}
// Token: 0x06000017 RID: 23 RVA: 0x000025A4 File Offset: 0x000007A4
internal bool SendFragmentBytes(byte[] bytes, int bytesToSend)
{
int num = 0;
while (bytesToSend > 0)
{
int num2 = Math.Min(bytesToSend, this.m_MaxPacketSize - 32);
byte[] array = new byte[num2];
Array.Copy(bytes, num, array, 0, num2);
ChannelBuffer.s_FragmentWriter.StartMessage(17);
ChannelBuffer.s_FragmentWriter.Write(0);
ChannelBuffer.s_FragmentWriter.WriteBytesFull(array);
ChannelBuffer.s_FragmentWriter.FinishMessage();
this.SendWriter(ChannelBuffer.s_FragmentWriter);
num += num2;
bytesToSend -= num2;
}
ChannelBuffer.s_FragmentWriter.StartMessage(17);
ChannelBuffer.s_FragmentWriter.Write(1);
ChannelBuffer.s_FragmentWriter.FinishMessage();
this.SendWriter(ChannelBuffer.s_FragmentWriter);
return true;
}
// Token: 0x06000018 RID: 24 RVA: 0x0000265C File Offset: 0x0000085C
internal bool SendBytes(byte[] bytes, int bytesToSend)
{
bool flag;
if (bytesToSend >= 65535)
{
if (LogFilter.logError)
{
Debug.LogError("ChannelBuffer:SendBytes cannot send packet larger than " + ushort.MaxValue + " bytes");
}
flag = false;
}
else if (bytesToSend <= 0)
{
if (LogFilter.logError)
{
Debug.LogError("ChannelBuffer:SendBytes cannot send zero bytes");
}
flag = false;
}
else if (bytesToSend > this.m_MaxPacketSize)
{
if (this.m_AllowFragmentation)
{
flag = this.SendFragmentBytes(bytes, bytesToSend);
}
else
{
if (LogFilter.logError)
{
Debug.LogError(string.Concat(new object[] { "Failed to send big message of ", bytesToSend, " bytes. The maximum is ", this.m_MaxPacketSize, " bytes on channel:", this.m_ChannelId }));
}
flag = false;
}
}
else if (!this.m_CurrentPacket.HasSpace(bytesToSend))
{
if (this.m_IsReliable)
{
if (this.m_PendingPackets.Count == 0)
{
if (!this.m_CurrentPacket.SendToTransport(this.m_Connection, (int)this.m_ChannelId))
{
this.QueuePacket();
}
this.m_CurrentPacket.Write(bytes, bytesToSend);
flag = true;
}
else if (this.m_PendingPackets.Count >= this.m_MaxPendingPacketCount)
{
if (!this.m_IsBroken)
{
if (LogFilter.logError)
{
Debug.LogError("ChannelBuffer buffer limit of " + this.m_PendingPackets.Count + " packets reached.");
}
}
this.m_IsBroken = true;
flag = false;
}
else
{
this.QueuePacket();
this.m_CurrentPacket.Write(bytes, bytesToSend);
flag = true;
}
}
else if (!this.m_CurrentPacket.SendToTransport(this.m_Connection, (int)this.m_ChannelId))
{
if (LogFilter.logError)
{
Debug.Log("ChannelBuffer SendBytes no space on unreliable channel " + this.m_ChannelId);
}
flag = false;
}
else
{
this.m_CurrentPacket.Write(bytes, bytesToSend);
flag = true;
}
}
else
{
this.m_CurrentPacket.Write(bytes, bytesToSend);
flag = this.maxDelay != 0f || this.SendInternalBuffer();
}
return flag;
}
// Token: 0x06000019 RID: 25 RVA: 0x000028C7 File Offset: 0x00000AC7
private void QueuePacket()
{
ChannelBuffer.pendingPacketCount++;
this.m_PendingPackets.Enqueue(this.m_CurrentPacket);
this.m_CurrentPacket = this.AllocPacket();
}
// Token: 0x0600001A RID: 26 RVA: 0x000028F4 File Offset: 0x00000AF4
private ChannelPacket AllocPacket()
{
ChannelPacket channelPacket;
if (ChannelBuffer.s_FreePackets.Count == 0)
{
channelPacket = new ChannelPacket(this.m_MaxPacketSize, this.m_IsReliable);
}
else
{
ChannelPacket channelPacket2 = ChannelBuffer.s_FreePackets[ChannelBuffer.s_FreePackets.Count - 1];
ChannelBuffer.s_FreePackets.RemoveAt(ChannelBuffer.s_FreePackets.Count - 1);
channelPacket2.Reset();
channelPacket = channelPacket2;
}
return channelPacket;
}
// Token: 0x0600001B RID: 27 RVA: 0x00002965 File Offset: 0x00000B65
private static void FreePacket(ChannelPacket packet)
{
if (ChannelBuffer.s_FreePackets.Count < 512)
{
ChannelBuffer.s_FreePackets.Add(packet);
}
}
// Token: 0x0600001C RID: 28 RVA: 0x00002990 File Offset: 0x00000B90
public bool SendInternalBuffer()
{
bool flag;
if (this.m_IsReliable && this.m_PendingPackets.Count > 0)
{
while (this.m_PendingPackets.Count > 0)
{
ChannelPacket channelPacket = this.m_PendingPackets.Dequeue();
if (!channelPacket.SendToTransport(this.m_Connection, (int)this.m_ChannelId))
{
this.m_PendingPackets.Enqueue(channelPacket);
break;
}
ChannelBuffer.pendingPacketCount--;
ChannelBuffer.FreePacket(channelPacket);
if (this.m_IsBroken && this.m_PendingPackets.Count < this.m_MaxPendingPacketCount / 2)
{
if (LogFilter.logWarn)
{
Debug.LogWarning("ChannelBuffer recovered from overflow but data was lost.");
}
this.m_IsBroken = false;
}
}
flag = true;
}
else
{
flag = this.m_CurrentPacket.SendToTransport(this.m_Connection, (int)this.m_ChannelId);
}
return flag;
}
// Token: 0x04000001 RID: 1
private NetworkConnection m_Connection;
// Token: 0x04000002 RID: 2
private ChannelPacket m_CurrentPacket;
// Token: 0x04000003 RID: 3
private float m_LastFlushTime;
// Token: 0x04000004 RID: 4
private byte m_ChannelId;
// Token: 0x04000005 RID: 5
private int m_MaxPacketSize;
// Token: 0x04000006 RID: 6
private bool m_IsReliable;
// Token: 0x04000007 RID: 7
private bool m_AllowFragmentation;
// Token: 0x04000008 RID: 8
private bool m_IsBroken;
// Token: 0x04000009 RID: 9
private int m_MaxPendingPacketCount;
// Token: 0x0400000A RID: 10
private const int k_MaxFreePacketCount = 512;
// Token: 0x0400000B RID: 11
public const int MaxPendingPacketCount = 16;
// Token: 0x0400000C RID: 12
public const int MaxBufferedPackets = 512;
// Token: 0x0400000D RID: 13
private Queue<ChannelPacket> m_PendingPackets;
// Token: 0x0400000E RID: 14
private static List<ChannelPacket> s_FreePackets;
// Token: 0x0400000F RID: 15
internal static int pendingPacketCount;
// Token: 0x04000010 RID: 16
public float maxDelay = 0.01f;
// Token: 0x04000011 RID: 17
private float m_LastBufferedMessageCountTimer = Time.realtimeSinceStartup;
// Token: 0x04000019 RID: 25
private static NetworkWriter s_SendWriter = new NetworkWriter();
// Token: 0x0400001A RID: 26
private static NetworkWriter s_FragmentWriter = new NetworkWriter();
// Token: 0x0400001B RID: 27
private const int k_PacketHeaderReserveSize = 100;
// Token: 0x0400001C RID: 28
private bool m_Disposed;
// Token: 0x0400001D RID: 29
internal NetBuffer fragmentBuffer = new NetBuffer();
// Token: 0x0400001E RID: 30
private bool readingFragment = false;
}
}