private static void handleIncomingHave(BinaryReader br, IPEndPoint peerAddress, ChannelId incomingChannel) { //successfull connection var message = new Have(); message.Decode(br); Console.WriteLine($"HAVE Chunk Bin Value: {message.BinValue}"); if (_incomingChannel == null) { _incomingChannel = incomingChannel; } else if (_incomingChannel != incomingChannel) { return; } long baseRight = BinUtils.BaseRight(message.BinValue); if (baseRight < _liveDiscardWindow) { Console.WriteLine("Bin smaller than live discard window"); return; } else { long binOffset = BinUtils.LayerOffset(baseRight); Console.WriteLine($"HAVE Chunk Most Right: {baseRight}"); Console.WriteLine($"HAVE Chunk Layer Offset: {binOffset}"); long temp = binOffset - _liveDiscardWindow + 1; long newBin = BinUtils.OffsetToBin(0, temp); long newChunk = BinUtils.LayerOffset(newBin); Console.WriteLine($"NEW Computed BIN: {newBin}"); Console.WriteLine($"NEW Computed CHUNK: {newChunk}"); } Environment.Exit(0); var returnMessage = new Request(); returnMessage.DestChannelId = _sendingChannel = _peers[peerAddress].SendingChannel; returnMessage.BinValue = message.BinValue; var returnMessageBytes = returnMessage.ToByteArray(); _client.Send(returnMessageBytes, returnMessageBytes.Length, peerAddress); }