private bool Receive(bool wait) { try { if ((!wait && _NoReceive) || !IsAlive) { return(false); } if (wait) { var timer = new Stopwatch(); var timeout = _Client.ReceiveTimeout; timer.Start(); while (Pending < Peek.Size) { if (!IsAlive || (Portal.Ticks % 1000 == 0 && !IsConnected)) { timer.Stop(); return(false); } if (Pending < 0 || Pending >= Peek.Size) { timer.Reset(); break; } if (timeout > 0 && timer.ElapsedMilliseconds >= timeout) { timer.Stop(); break; } Thread.Sleep(1); } } if ((!wait && _NoReceive) || !IsAlive || Pending < Peek.Size) { return(false); } var peek = Peek.Acquire(); var head = 0; while (head < peek.Length && _Client != null) { head += _Client.Receive(peek, head, peek.Length - head, SocketFlags.None); if (_Client == null || !_Client.Connected || head >= peek.Length) { break; } } if (head < peek.Length) { if (_DisplayRecvOutput) { ToConsole("Recv: Peek Failed at {0} / {1} bytes", head, peek.Length); } Peek.Free(ref peek); Dispose(); return(false); } var pid = BitConverter.ToUInt16(peek, 0); if (GetHandler(pid) == null) { if (_DisplayRecvOutput) { ToConsole("Recv: Unknown Packet ({0})", pid); } Peek.Free(ref peek); Dispose(); return(false); } var sid = BitConverter.ToUInt16(peek, 2); if (IsRemoteClient) { if (!_IsSeeded || !_ServerID.HasValue) { _ServerID = sid; _IsSeeded = true; } else if (_ServerID != sid) { if (_DisplayRecvOutput) { ToConsole("Recv: Server ID Spoofed ({0})", sid); } Peek.Free(ref peek); Dispose(); return(false); } } else if (IsLocalClient) { if (!_IsSeeded) { _IsSeeded = true; } if (!_ServerID.HasValue) { _ServerID = sid; } } var size = BitConverter.ToInt32(peek, 4); if (size < PortalPacket.MinSize || size > PortalPacket.MaxSize) { if (_DisplayRecvOutput) { ToConsole( "Recv: Size Out Of Range for {0} at {1} / {2} - {3} bytes", pid, size, PortalPacket.MinSize, PortalPacket.MaxSize); } Peek.Free(ref peek); Dispose(); return(false); } var buffer = new PortalBuffer(size); for (var i = 0; i < peek.Length; i++) { buffer[i] = peek[i]; } Peek.Free(ref peek); if (size > head) { var length = head + buffer.Receive(_Client, head, size - head); if (length < size) { if (_DisplayRecvOutput) { ToConsole("Recv: Failed for {0} at {1} / {2} bytes", pid, length, size); } buffer.Dispose(); Dispose(); return(false); } } if (!QueueReceive(buffer)) { buffer.Dispose(); return(false); } return(true); } catch (Exception e) { ToConsole("Recv: Exception Thrown", e); Dispose(); return(false); } }
public long Receive(Socket socket, long offset, long length) { return(_Buffer.Receive(socket, offset, length)); }