// Returns a random new potential neighbor. Returns null if no new neighbor is found. public static Peer scanForNeighbor() { Peer connectToPeer = null; // Find only masternodes while (connectToPeer == null) { Thread.Sleep(10); bool addr_valid = true; if (getConnectedClients(true).Count() == 0) { PeerStorage.resetInitialConnectionCount(); } Peer p = PeerStorage.getRandomMasterNodeAddress(); if (p == null) { break; } // Next, check if we're connecting to a self address of this node string[] server = p.hostname.Split(':'); if (server.Length < 2) { break; } // Resolve the hostname first string resolved_server_name = NetworkUtils.resolveHostname(server[0]); string resolved_server_name_with_port = resolved_server_name + ":" + server[1]; // Check if we are already connected to this address lock (networkClients) { foreach (NetworkClient client in networkClients) { if (client.getFullAddress(true).Equals(resolved_server_name_with_port, StringComparison.Ordinal)) { // Address is already in the client list addr_valid = false; break; } } } // Check if node is already in the server list string[] connectedClients = NetworkServer.getConnectedClients(true); for (int i = 0; i < connectedClients.Length; i++) { if (connectedClients[i].Equals(resolved_server_name_with_port, StringComparison.Ordinal)) { // Address is already in the client list addr_valid = false; break; } } if (addr_valid == false) { continue; } // Check against connecting clients list as well lock (connectingClients) { foreach (string client in connectingClients) { if (resolved_server_name_with_port.Equals(client, StringComparison.Ordinal)) { // Address is already in the connecting client list addr_valid = false; break; } } } if (addr_valid == false) { continue; } if (NetworkServer.isRunning()) { // Get all self addresses and run through them List <string> self_addresses = CoreNetworkUtils.GetAllLocalIPAddresses(); foreach (string self_address in self_addresses) { // Don't connect to self if (resolved_server_name.Equals(self_address, StringComparison.Ordinal)) { if (server[1].Equals(string.Format("{0}", IxianHandler.publicPort), StringComparison.Ordinal)) { addr_valid = false; } } } } // If the address is valid, add it to the candidates if (addr_valid) { connectToPeer = p; } } return(connectToPeer); }
// Connects to a specified node, with the syntax host:port public static bool connectTo(string host, byte[] wallet_address) { if (host == null || host.Length < 3) { Logging.error(String.Format("Invalid host address {0}", host)); return(false); } string[] server = host.Split(':'); if (server.Count() < 2) { Logging.warn(string.Format("Cannot connect to invalid hostname: {0}", host)); return(false); } // Resolve the hostname first string resolved_server_name = NetworkUtils.resolveHostname(server[0]); // Skip hostnames we can't resolve if (resolved_server_name.Length < 1) { Logging.warn(string.Format("Cannot resolve IP for {0}, skipping connection.", server[0])); return(false); } string resolved_host = string.Format("{0}:{1}", resolved_server_name, server[1]); if (NetworkServer.isRunning()) { // Verify against the publicly disclosed ip // Don't connect to self if (resolved_server_name.Equals(IxianHandler.publicIP, StringComparison.Ordinal)) { if (server[1].Equals(string.Format("{0}", IxianHandler.publicPort), StringComparison.Ordinal)) { Logging.info(string.Format("Skipping connection to public self seed node {0}", host)); return(false); } } // Get all self addresses and run through them List <string> self_addresses = CoreNetworkUtils.GetAllLocalIPAddresses(); foreach (string self_address in self_addresses) { // Don't connect to self if (resolved_server_name.Equals(self_address, StringComparison.Ordinal)) { if (server[1].Equals(string.Format("{0}", IxianHandler.publicPort), StringComparison.Ordinal)) { Logging.info(string.Format("Skipping connection to self seed node {0}", host)); return(false); } } } } lock (connectingClients) { foreach (string client in connectingClients) { if (resolved_host.Equals(client, StringComparison.Ordinal)) { // We're already connecting to this client return(false); } } // The the client to the connecting clients list connectingClients.Add(resolved_host); } // Check if node is already in the client list lock (networkClients) { foreach (NetworkClient client in networkClients) { if (client.getFullAddress(true).Equals(resolved_host, StringComparison.Ordinal)) { // Address is already in the client list return(false); } } } // Check if node is already in the server list string[] connectedClients = NetworkServer.getConnectedClients(true); for (int i = 0; i < connectedClients.Length; i++) { if (connectedClients[i].Equals(resolved_host, StringComparison.Ordinal)) { // Address is already in the client list return(false); } } // Connect to the specified node NetworkClient new_client = new NetworkClient(); // Recompose the connection address from the resolved IP and the original port bool result = new_client.connectToServer(resolved_server_name, Convert.ToInt32(server[1]), wallet_address); // Add this node to the client list if connection was successfull if (result == true) { // Add this node to the client list lock (networkClients) { networkClients.Add(new_client); } } else { new_client.stop(); } // Remove this node from the connecting clients list lock (connectingClients) { connectingClients.Remove(resolved_host); } return(result); }