/// <summary> /// Despatches received data from the arg through to terrarias internal buffers /// </summary> protected virtual void DespatchData(ReceiveArgs args) { var id = this.RemoteClient.Id; MessageBuffer obj = NetMessage.buffer[id]; lock (obj) { if (!this.RemoteClient.IsActive) { this.RemoteClient.IsActive = true; this.RemoteClient.State = 0; } Buffer.BlockCopy(args.Buffer, args.Offset, NetMessage.buffer[id].readBuffer, NetMessage.buffer[id].totalData, recvBytes); NetMessage.buffer[id].totalData += recvBytes; NetMessage.buffer[id].checkBytes = true; recvBytes = 0; } }
public virtual void ReceiveCompleted(ReceiveArgs args) { try { bool release = false; if (args.SocketError != SocketError.Success) { release = true; HandleError(args.SocketError); } else if (args.BytesTransferred == 0) { release = true; HandleError(SocketError.Disconnecting); } else { var receiving = false; while (!receiving) { recvBytes += args.BytesTransferred; this.DespatchData(args); var left = args.Buffer.Length - recvBytes; if (left <= 0) { return; } args.SetBuffer(args.Buffer, recvBytes, left); try { receiving = args.origin.ReceiveAsync(args); } catch (ObjectDisposedException) { receiving = false; } } if (!receiving) { release = true; } } if (release) { args.conn = null; args.origin = null; Server.ReceiveSocketPool.PushBack(args); } this.RemoteClient.IsReading = false; } catch (Exception ex) { Console.WriteLine(ex); } }