/// <summary> /// Initializes the torrent engine. /// </summary> public static void Initialize() { if (isInitialized) { return; } isInitialized = true; Log.LogInfo("[Engine] Starting up TorrentEngine."); if (engineThread != null) { engineThread.Join(); engineThread = null; } isStopping = false; workQueueResetEvent.Set(); DiskManager.Initialize(); PeerListener.StartListening(); LocalPeerListener.StartListening(); LocalPeerDiscovery.Initialize(); engineThread = new Thread(EngineLoop); engineThread.Priority = ThreadPriority.Normal; engineThread.Name = "TorrentEngineThread"; engineThread.Start(); }
/// <summary> /// Uninitializes the torrent engine. /// </summary> public static void Uninitialize() { if (!isInitialized) { return; } Log.LogInfo("[Engine] Shutting down TorrentEngine."); isInitialized = false; isStopping = true; workQueueResetEvent.Set(); TorrentRegistry.StopAllActiveTorrents(); PeerListener.StopListening(); LocalPeerListener.StopListening(); LocalPeerDiscovery.Uninitialize(); DiskManager.Uninitialize(); if (engineThread != null) { engineThread.Join(); engineThread = null; } }
private void _localDiscovery_PeerDiscovered(LocalPeerDiscovery sender, IPEndPoint peerEP, BinaryID networkID) { lock (_networks) { if (_networks.ContainsKey(networkID)) { _networks[networkID].MakeConnection(peerEP); } } }
int _reNegotiateAfterSeconds = 3600; //1hr #endregion #region constructor public InternalBitChatService(BitChatService service, BitChatProfile profile, Certificate[] trustedRootCertificates, SecureChannelCryptoOptionFlags supportedCryptoOptions) { _service = service; _profile = profile; _trustedRootCertificates = trustedRootCertificates; _supportedCryptoOptions = supportedCryptoOptions; _connectionManager = new ConnectionManager(_profile.LocalEP, ChannelRequest); LocalPeerDiscovery.StartListener(41733); _localDiscovery = new LocalPeerDiscovery(_connectionManager.LocalEP.Port); _localDiscovery.PeerDiscovered += _localDiscovery_PeerDiscovered; _profile.LocalEP = _connectionManager.LocalEP; }
private void LocalDiscovery_PeerDiscovered(LocalPeerDiscovery sender, IPEndPoint peerEP, BinaryID networkID) { lock (_chats) { if (_chats.ContainsKey(networkID)) { _chats[networkID].Network.MakeConnection(peerEP); } else { foreach (KeyValuePair <BinaryID, BitChat> chat in _chats) { if (networkID.Equals(chat.Value.Network.MaskedPeerEmailAddress)) { chat.Value.Network.SendInvitation(new IPEndPoint[] { peerEP }); break; } } } } }
public void Start() { if (_connectionManager != null) { return; } //set min threads since the default value is too small for client at startup due to multiple chats queuing too many tasks immediately { int minWorker, minIOC; ThreadPool.GetMinThreads(out minWorker, out minIOC); minWorker = Environment.ProcessorCount * 32; ThreadPool.SetMinThreads(minWorker, minIOC); } //verify root certs foreach (Certificate trustedCert in _trustedRootCertificates) { trustedCert.Verify(_trustedRootCertificates); } //verify profile cert _profile.LocalCertificateStore.Certificate.Verify(_trustedRootCertificates); //start connection manager _connectionManager = new ConnectionManager(_profile); _connectionManager.InternetConnectivityStatusChanged += ConnectionManager_InternetConnectivityStatusChanged; _connectionManager.BitChatNetworkChannelInvitation += ConnectionManager_BitChatNetworkChannelInvitation; _connectionManager.BitChatNetworkChannelRequest += ConnectionManager_BitChatNetworkChannelRequest; _connectionManager.TcpRelayPeersAvailable += ConnectionManager_TcpRelayPeersAvailable; //start local peer discovery LocalPeerDiscovery.StartListener(41733); _localDiscovery = new LocalPeerDiscovery(_connectionManager.LocalPort); _localDiscovery.PeerDiscovered += LocalDiscovery_PeerDiscovered; //check inbound invitation tracking ManageInboundInvitationTracking(); foreach (BitChatProfile.BitChatInfo bitChatInfo in _profile.BitChatInfoList) { try { BitChatNetwork network; if (bitChatInfo.Type == BitChatNetworkType.PrivateChat) { if (bitChatInfo.PeerEmailAddress == null) { network = new BitChatNetwork(_connectionManager, _trustedRootCertificates, _supportedCryptoOptions, bitChatInfo.HashedPeerEmailAddress, bitChatInfo.NetworkID, bitChatInfo.NetworkSecret, bitChatInfo.NetworkStatus, bitChatInfo.InvitationSender, bitChatInfo.InvitationMessage); } else { network = new BitChatNetwork(_connectionManager, _trustedRootCertificates, _supportedCryptoOptions, bitChatInfo.PeerEmailAddress, bitChatInfo.SharedSecret, bitChatInfo.NetworkID, bitChatInfo.NetworkSecret, bitChatInfo.PeerCertificateList, bitChatInfo.NetworkStatus, bitChatInfo.InvitationSender, bitChatInfo.InvitationMessage); } } else { network = new BitChatNetwork(_connectionManager, _trustedRootCertificates, _supportedCryptoOptions, bitChatInfo.NetworkName, bitChatInfo.SharedSecret, bitChatInfo.NetworkID, bitChatInfo.NetworkSecret, bitChatInfo.PeerCertificateList, bitChatInfo.NetworkStatus); } BitChat chat = CreateBitChat(network, bitChatInfo.MessageStoreID, bitChatInfo.MessageStoreKey, bitChatInfo.GroupImageDateModified, bitChatInfo.GroupImage, bitChatInfo.SharedFileList, bitChatInfo.TrackerURIs, bitChatInfo.EnableTracking, bitChatInfo.SendInvitation, bitChatInfo.Mute); _chats.Add(chat.NetworkID, chat); } catch { } } //check profile cert revocation ThreadPool.QueueUserWorkItem(CheckCertificateRevocationAsync, new Certificate[] { _profile.LocalCertificateStore.Certificate }); //check trusted root cert revocation ThreadPool.QueueUserWorkItem(CheckCertificateRevocationAsync, _trustedRootCertificates); }