public void RecieveResponse()
        {
            try
            {
                byte[] response      = new byte[Constants.MaxMessageSize];
                var    bytesReceived = Socket.Receive(response);

                if (bytesReceived == 0)
                {
                    HandleDisconnect("0 bytes read. Disconnected");
                    return;
                }

                var trimmedResponse = response.Take(bytesReceived);
                TemporaryReceiveBuffer.AddRange(trimmedResponse);

                PeerEventData peerEventData;
                do
                {
                    var peerEventDataWrapper = PeerEventDataFactory.TryParsePeerEventDataFromEnumerable(TemporaryReceiveBuffer);
                    TemporaryReceiveBuffer = peerEventDataWrapper.UnusedBytes.ToList(); //Store unused bytes for later use

                    peerEventData = peerEventDataWrapper.EventData;
                    HandlePeerEvent(peerEventData);
                }while (TemporaryReceiveBuffer.Count != 0 && peerEventData.EventStatus == PeerEventStatus.Ok);
            }
            catch (Exception ex)
            {
                HandleDisconnect(ex.Message);
            }
        }
        public bool TryInitiateHandsake()
        {
            var peerHandshake = new PeerHandshake(Constants.HandshakeProtocolIdentifier, InfoHash, PeerId);

            try
            {
                Socket.Send(peerHandshake.ToHandshakeBytes());
                byte[] response      = new byte[Constants.MaxMessageSize];
                var    bytesReceived = Socket.Receive(response);

                if (bytesReceived == 0)
                {
                    return(false);
                }

                var handshakeContent = new PeerHandshake(response.Take(bytesReceived).ToArray());

                if (!InfoHash.SequenceEqual(handshakeContent.InfoHash))
                {
                    return(false);
                }

                var totalHandshakeBytes = handshakeContent.Length + handshakeContent.Reserved.Length + 1 +
                                          handshakeContent.InfoHash.Length + handshakeContent.PeerId.Length;

                var leftovers = response.Skip(totalHandshakeBytes).Take(bytesReceived - totalHandshakeBytes);
                TemporaryReceiveBuffer.AddRange(leftovers);

                return(true);
            }
            catch
            {
                return(false);
            }
        }