$subfolder = $sql_row["subfolder"]; $port_number = $sql_row["port_number"]; $poll_peer = poll_peer($ip_address, $domain, $subfolder, $port_number, 10000, "peerlist.php?action=new_peers"); $peer_counter = 1; // Reset peer counter while ($peer_counter <= 15) { $peer_IP = NULL; $peer_domain = NULL; $peer_subfolder = NULL; $peer_port_number = NULL; // Sort Data $peer_IP = find_string("-----IP{$peer_counter}=", "-----domain{$peer_counter}", $poll_peer); $peer_domain = find_string("-----domain{$peer_counter}=", "-----subfolder{$peer_counter}", $poll_peer); $peer_subfolder = find_string("-----subfolder{$peer_counter}=", "-----port_number{$peer_counter}", $poll_peer); $peer_port_number = find_string("-----port_number{$peer_counter}=", "-----", $poll_peer); if (is_domain_valid($peer_domain) == FALSE) { // Someone is using an IP address or Localhost :p $peer_domain = NULL; } if (empty($peer_port_number) == TRUE && empty($peer_subfolder) == TRUE) { // No more peers, end this loop early break; } if (empty($peer_IP) == TRUE && empty($peer_domain) == TRUE) { $duplicate_peer == TRUE; // Flag to avoid putting blank entry in database } else { // Check to make sure that this peer is not already in our new peer list $duplicate_check1 = mysql_result(mysql_query("SELECT * FROM `new_peers_list` WHERE `IP_Address` = '{$peer_IP}' LIMIT 1"), 0, 0); $duplicate_check2 = mysql_result(mysql_query("SELECT * FROM `new_peers_list` WHERE `domain` LIKE '{$peer_domain}' LIMIT 1"), 0, 1); if (empty($peer_IP) == TRUE) {
function peer_list() { ini_set('user_agent', 'Timekoin Client (Peerlist) v' . TIMEKOIN_VERSION); ini_set('default_socket_timeout', 2); // Timeout for request in seconds $max_active_peers = mysql_result(mysql_query("SELECT * FROM `options` WHERE `field_name` = 'max_active_peers' LIMIT 1"), 0, "field_data"); $max_new_peers = mysql_result(mysql_query("SELECT * FROM `options` WHERE `field_name` = 'max_new_peers' LIMIT 1"), 0, "field_data"); // How many active peers do we have? $active_peers = mysql_result(mysql_query("SELECT COUNT(join_peer_list) FROM `active_peer_list`"), 0); $new_peers = mysql_result(mysql_query("SELECT COUNT(poll_failures) FROM `new_peers_list`"), 0); if ($active_peers == 0) { // No active or new peers to poll from, start with the first contact servers // and copy them to the new peer list $sql = "SELECT * FROM `options` WHERE `field_name` = 'first_contact_server'"; $sql_result = mysql_query($sql); $sql_num_results = mysql_num_rows($sql_result); write_log("Peer List Empty. Adding First Contact Servers.", "PL"); // First Contact Server Format //---ip=192.168.0.1---domain=timekoin.com---subfolder=timekoin---port=80---code=guest---end for ($i = 0; $i < $sql_num_results; $i++) { $sql_row = mysql_fetch_array($sql_result); $peer_ip = find_string("---ip=", "---domain", $sql_row["field_data"]); $peer_domain = find_string("---domain=", "---subfolder", $sql_row["field_data"]); $peer_subfolder = find_string("---subfolder=", "---port", $sql_row["field_data"]); $peer_port_number = find_string("---port=", "---code", $sql_row["field_data"]); $peer_code = find_string("---code=", "---end", $sql_row["field_data"]); // Insert into database as first contact server(s) $sql = "INSERT INTO `active_peer_list` (`IP_Address` ,`domain` ,`subfolder` ,`port_number` ,`last_heartbeat`, `join_peer_list`, `failed_sent_heartbeat`, `code`)\n\t\t\tVALUES ('{$peer_ip}', '{$peer_domain}', '{$peer_subfolder}', '{$peer_port_number}', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), '0', '{$peer_code}');"; mysql_query($sql); $active_peers++; } } if ($active_peers < $max_active_peers) { //Start polling peers from the new peers list $sql = "SELECT * FROM `new_peers_list` ORDER BY RAND() LIMIT 10"; $sql_result = mysql_query($sql); $sql_num_results = mysql_num_rows($sql_result); // Peer difference $peer_difference_count = $max_active_peers - $active_peers; for ($i = 0; $i < $sql_num_results; $i++) { $sql_row = mysql_fetch_array($sql_result); $ip_address = $sql_row["IP_Address"]; $domain = $sql_row["domain"]; $subfolder = $sql_row["subfolder"]; $port_number = $sql_row["port_number"]; $poll_failures = $sql_row["poll_failures"]; $code = $sql_row["code"]; // Check to make sure that this peer is not already in our active peer list $duplicate_check1 = mysql_result(mysql_query("SELECT * FROM `active_peer_list` WHERE `IP_Address` = '{$ip_address}' LIMIT 1"), 0, 0); $duplicate_check2 = mysql_result(mysql_query("SELECT * FROM `active_peer_list` WHERE `domain` LIKE '{$domain}' LIMIT 1"), 0, 1); if (empty($ip_address) == TRUE) { //Don't have an IP address, check for duplicate domain or my own domain if (empty($duplicate_check2) == TRUE) { // Neither IP nor Domain exist $duplicate_peer = FALSE; } else { $duplicate_peer = TRUE; } } else { // Using IP only, is there a duplicate IP or Domain if (empty($duplicate_check1) == TRUE && empty($duplicate_check2) == TRUE) { $duplicate_peer = FALSE; } else { $duplicate_peer = TRUE; } } if ($duplicate_peer == FALSE) { // Poll Peer for Access if (empty($code) == TRUE) { // Try guest access $poll_peer = poll_peer($ip_address, $domain, $subfolder, $port_number, 5, "api.php?action=tk_hash_status&hash=guest"); } else { // Using custom code for peer $poll_peer = poll_peer($ip_address, $domain, $subfolder, $port_number, 5, "api.php?action=tk_hash_status&hash={$code}"); } if ($poll_peer == TRUE) { // Add this peer to the active list // Insert this peer into our active peer table // Save only domain name if both IP and Domain exist if (empty($domain) == FALSE) { $ip_address = NULL; } if (empty($code) == TRUE) { $code = "guest"; } // Store new peer in active list $sql = "INSERT INTO `active_peer_list` (`IP_Address` ,`domain` ,`subfolder` ,`port_number` ,`last_heartbeat` ,`join_peer_list` ,`failed_sent_heartbeat` ,`code`)\n\t\t\tVALUES ('{$ip_address}', '{$domain}', '{$subfolder}', '{$port_number}', '" . time() . "', '" . time() . "', '0', '{$code}');"; if (mysql_query($sql) == TRUE) { // Subtract 1 from the peer difference count $peer_difference_count--; write_log("Joined with Peer {$ip_address}:{$domain}:{$port_number}/{$subfolder}", "PL"); } } else { //No response, record polling failure for future reference $poll_failures++; mysql_query("UPDATE `new_peers_list` SET `poll_failures` = '{$poll_failures}' WHERE `IP_Address` = '{$ip_address}' AND `domain` = '{$domain}' AND `subfolder` = '{$subfolder}' AND `port_number` = {$port_number} LIMIT 1"); } } else { // Active response will remove poll failures mysql_query("UPDATE `new_peers_list` SET `poll_failures` = 0 WHERE `IP_Address` = '{$ip_address}' AND `domain` = '{$domain}' AND `subfolder` = '{$subfolder}' AND `port_number` = {$port_number} LIMIT 1"); } // Check to see if enough peers have been added if ($peer_difference_count <= 0) { // Break out of loop break; } } // End For Loop } // End Active vs Max Peer Check //*********************************************************************************** // Add more peers to the new peers list to satisfy new peer limit // How many new peers do we have now? $sql = "SELECT * FROM `new_peers_list`"; $new_peers_numbers = mysql_num_rows(mysql_query($sql)); if ($new_peers_numbers < $max_new_peers && rand(1, 3) == 2) { // Add more possible peers to the new peer list by polling what the active peers have $sql = "SELECT * FROM `active_peer_list` ORDER BY RAND() LIMIT 10"; $sql_result = mysql_query($sql); $sql_num_results = mysql_num_rows($sql_result); $new_peer_difference = $max_new_peers - $new_peers_numbers; for ($i = 0; $i < $sql_num_results; $i++) { $sql_row = mysql_fetch_array($sql_result); $ip_address = $sql_row["IP_Address"]; $domain = $sql_row["domain"]; $subfolder = $sql_row["subfolder"]; $port_number = $sql_row["port_number"]; $poll_peer = poll_peer($ip_address, $domain, $subfolder, $port_number, 10000, "peerlist.php?action=new_peers"); $peer_counter = 1; // Reset peer counter while ($peer_counter <= 15) { $peer_IP = NULL; $peer_domain = NULL; $peer_subfolder = NULL; $peer_port_number = NULL; // Sort Data $peer_IP = find_string("-----IP{$peer_counter}=", "-----domain{$peer_counter}", $poll_peer); $peer_domain = find_string("-----domain{$peer_counter}=", "-----subfolder{$peer_counter}", $poll_peer); $peer_subfolder = find_string("-----subfolder{$peer_counter}=", "-----port_number{$peer_counter}", $poll_peer); $peer_port_number = find_string("-----port_number{$peer_counter}=", "-----", $poll_peer); if (is_domain_valid($peer_domain) == FALSE) { // Someone is using an IP address or Localhost :p $peer_domain = NULL; } if (empty($peer_port_number) == TRUE && empty($peer_subfolder) == TRUE) { // No more peers, end this loop early break; } if (empty($peer_IP) == TRUE && empty($peer_domain) == TRUE) { $duplicate_peer == TRUE; // Flag to avoid putting blank entry in database } else { // Check to make sure that this peer is not already in our new peer list $duplicate_check1 = mysql_result(mysql_query("SELECT * FROM `new_peers_list` WHERE `IP_Address` = '{$peer_IP}' LIMIT 1"), 0, 0); $duplicate_check2 = mysql_result(mysql_query("SELECT * FROM `new_peers_list` WHERE `domain` LIKE '{$peer_domain}' LIMIT 1"), 0, 1); if (empty($peer_IP) == TRUE) { //Don't have an IP address, check for duplicate domain if (empty($duplicate_check2) == TRUE) { // Neither IP nor Domain exist $duplicate_peer = FALSE; } else { $duplicate_peer = TRUE; } } else { // Using IP only, is there a duplicate if (empty($duplicate_check1) == TRUE) { if (empty($duplicate_check2) == FALSE) { $duplicate_peer = TRUE; } else { $duplicate_peer = TRUE; } } else { $duplicate_peer = TRUE; } } } if ($duplicate_peer == FALSE) { // Save only domain name if both IP and Domain exist if (empty($peer_domain) == FALSE) { $peer_IP = NULL; } if (empty($peer_IP) == FALSE || empty($peer_domain) == FALSE) { // This is a fresh new peer, add it to the database list $sql = "INSERT INTO `new_peers_list` (`IP_Address` ,`domain` ,`subfolder` ,`port_number` ,`poll_failures` ,`code`)\n\t\t\t\tVALUES ('{$peer_IP}', '{$peer_domain}', '{$peer_subfolder}', '{$peer_port_number}', '0', 'guest')"; if (mysql_query($sql) == TRUE) { // Subtract one from total left to find $new_peer_difference--; } } } if ($new_peer_difference <= 0) { // Enough new peers saved, break out of while loop early break; } $peer_counter++; } // End While loop check if ($new_peer_difference <= 0) { // Enough new peers saved, break out of for loop early break; } } // End For loop check } // End New Peers vs Max New Peers check //*********************************************************************************** // Send a heartbeat to all active peers in our list to make sure they are still online $sql = "SELECT * FROM `active_peer_list`"; $sql_result = mysql_query($sql); $sql_num_results = mysql_num_rows($sql_result); for ($i = 0; $i < $sql_num_results; $i++) { $sql_row = mysql_fetch_array($sql_result); if (rand(1, 3) == 2) { $ip_address = $sql_row["IP_Address"]; $domain = $sql_row["domain"]; $subfolder = $sql_row["subfolder"]; $port_number = $sql_row["port_number"]; $last_heartbeat = $sql_row["last_heartbeat"]; $join_peer_list = $sql_row["join_peer_list"]; $failed_sent_heartbeat = $sql_row["failed_sent_heartbeat"]; $code = $sql_row["code"]; $poll_peer = poll_peer($ip_address, $domain, $subfolder, $port_number, 5, "api.php?action=tk_hash_status&hash={$code}"); if ($poll_peer == TRUE) { //Got a response from an active Timekoin server mysql_query("UPDATE `active_peer_list` SET `last_heartbeat` = '" . time() . "', `failed_sent_heartbeat` = 0 WHERE `IP_Address` = '{$ip_address}' AND `domain` = '{$domain}' AND `subfolder` = '{$subfolder}' AND `port_number` = {$port_number} LIMIT 1"); } else { //No response, record polling failure for future reference $failed_sent_heartbeat++; mysql_query("UPDATE `active_peer_list` SET `failed_sent_heartbeat` = '{$failed_sent_heartbeat}' WHERE `IP_Address` = '{$ip_address}' AND `domain` = '{$domain}' AND `subfolder` = '{$subfolder}' AND `port_number` = {$port_number} LIMIT 1"); } } // End Randomize Check } // End for Loop // Remove all active peers that are offline for more than 5 minutes if (rand(1, 2) == 2) { mysql_query("DELETE QUICK FROM `active_peer_list` WHERE `last_heartbeat` < " . (time() - 300) . " AND `join_peer_list` != 0"); } //*********************************************************************************** // Send a heartbeat to all reserve peers in our list to make sure they are still online $sql = "SELECT * FROM `new_peers_list`"; $sql_result = mysql_query($sql); $sql_num_results = mysql_num_rows($sql_result); for ($i = 0; $i < $sql_num_results; $i++) { $sql_row = mysql_fetch_array($sql_result); if (rand(1, 3) == 2) { $ip_address = $sql_row["IP_Address"]; $domain = $sql_row["domain"]; $subfolder = $sql_row["subfolder"]; $port_number = $sql_row["port_number"]; $poll_failures = $sql_row["poll_failures"]; // Query Server for valid Hashcode $poll_peer = poll_peer($ip_address, $domain, $subfolder, $port_number, 5, "api.php?action=tk_hash_status&hash={$code}"); if ($poll_peer == TRUE) { //Got a response from an active Timekoin server mysql_query("UPDATE `new_peers_list` SET `poll_failures` = 0 WHERE `IP_Address` = '{$ip_address}' AND `domain` = '{$domain}' AND `subfolder` = '{$subfolder}' AND `port_number` = {$port_number} LIMIT 1"); } else { //No response, record polling failure for future reference $poll_failures++; mysql_query("UPDATE `new_peers_list` SET `poll_failures` = '{$poll_failures}' WHERE `IP_Address` = '{$ip_address}' AND `domain` = '{$domain}' AND `subfolder` = '{$subfolder}' AND `port_number` = {$port_number} LIMIT 1"); } } // End Randomize Check } // End for Loop // Clean up reserve peer list by removing those that have no responded for over 6 poll attempts if (rand(1, 2) == 2) { mysql_query("DELETE QUICK FROM `new_peers_list` WHERE `poll_failures` > 6"); } return; }