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); } }