internal void ConnectToPeer(TorrentManager manager, Peer peer) { // Connect to the peer. var connection = ConnectionFactory.Create(peer.ConnectionUri); if (connection == null) { return; } peer.LastConnectionAttempt = DateTime.Now; var c = new AsyncConnectState(manager, peer, connection); _pendingConnects.Add(c); manager.Peers.ConnectingToPeers.Add(peer); NetworkIO.EnqueueConnect(connection, _endCreateConnectionCallback, c); }
static void MessageLengthReceived(bool successful, int transferred, object state) { var data = (ReceiveMessageState)state; int messageLength = -1; if (successful) { data.Decryptor.Decrypt(data.Buffer, 0, transferred); messageLength = IPAddress.HostToNetworkOrder(BitConverter.ToInt32(data.Buffer, 0)); } if (!successful || messageLength < 0 || messageLength > MaxMessageLength) { ClientEngine.BufferManager.FreeBuffer(data.Buffer); data.Callback(false, null, data.State); receiveCache.Enqueue(data); return; } if (messageLength == 0) { ClientEngine.BufferManager.FreeBuffer(data.Buffer); data.Callback(true, new KeepAliveMessage(), data.State); receiveCache.Enqueue(data); return; } var buffer = ClientEngine.BufferManager.GetBuffer(messageLength + transferred); Buffer.BlockCopy(data.Buffer, 0, buffer, 0, transferred); ClientEngine.BufferManager.FreeBuffer(data.Buffer); data.Buffer = buffer; NetworkIO.EnqueueReceive(data.Connection, buffer, transferred, messageLength, data.RateLimiter, data.PeerMonitor, data.ManagerMonitor, MessageBodyReceivedCallback, data); }