예제 #1
0
 public void SetBitField(PeerMessage message)
 {
     for (int i = message.rawBytesOffset; i < message.GetMsgContents().Length; i++)
     {
         byte mask    = 0b10000000;
         byte curByte = message.GetMsgContents()[i];
         for (int bit = 7; bit >= 0; bit--)
         {
             if ((i - message.rawBytesOffset) * 8 + (7 - bit) >= peersPieces.Count)
             {
                 break;
             }
             peersPieces.Set((i - message.rawBytesOffset) * 8 + (7 - bit), (curByte & mask) != 0);
             mask >>= 1;
         }
     }
 }
예제 #2
0
        public async Task <int> PeerHandshakeAsync(byte[] infoHash, string peerID, CancellationTokenSource cancellationToken)
        {
            await connectionClient.ConnectAsync(endPoint.Address, endPoint.Port).ConfigureAwait(false);

            if (cancellationToken.IsCancellationRequested)
            {
                return(-1);
            }
            var handshakeMessage = new PeerMessage(infoHash, peerID);
            await connectionClient.GetStream().WriteAsync(handshakeMessage.GetMsgContents(), 0,
                                                          handshakeMessage.GetMsgContents().Length, cancellationToken.Token).ConfigureAwait(false);

            var message = await RecieveHandshakeMessageAsync(cancellationToken).ConfigureAwait(false);

            if (message == null || message.messageType != PeerMessageType.handshake)
            {
                return(-1);
            }
            // setting the timer for two minutes
            activityTimer = new Timer(TimerCallback, null, TIMEOUT * 1000, TIMEOUT * 1000);
            return(0);
        }
예제 #3
0
 public void SendPeerMessage(PeerMessage message)
 {
     ResetTimer();
     connectionClient.GetStream().Write(message.GetMsgContents(), 0, message.GetMsgContents().Length);
 }