Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
 public long Receive(Socket socket, long offset, long length)
 {
     return(_Buffer.Receive(socket, offset, length));
 }