diff --git a/API-README b/API-README index 2829b95d..58f185e8 100644 --- a/API-README +++ b/API-README @@ -1247,6 +1247,28 @@ N.B. the accuracy of the timing used to wait for the replies is --------- +Default: + $mcastretries = 0; + +Set $mcastretries to the number of times to retry the multicast + +If $mcastexpect is 0, this is simply the number of extra times +that it will send the multicast request +N.B. cgminer doesn't listen for multicast requests for 1000ms after +each one it hears + +If $mcastexpect is > 0, it will stop looking for replies once it +has found at least $mcastexpect rigs, but it only checks this rig +limit each time it reaches the $mcasttimeout limit, thus it can find +more than $mcastexpect rigs if more exist +It will send the multicast message up to $mcastretries extra times or +until it has found at least $mcastexpect rigs +However, when using $mcastretries, it is possible for it to sometimes +ignore some rigs on the network if $mcastexpect is less than the +number of rigs on the network and some rigs are too slow to reply + +--------- + Default: $allowgen = false; diff --git a/miner.php b/miner.php index fdb9e52f..a43d9af5 100644 --- a/miner.php +++ b/miner.php @@ -3,7 +3,7 @@ session_start(); # global $doctype, $title, $miner, $port, $readonly, $notify, $rigs; global $mcast, $mcastexpect, $mcastaddr, $mcastport, $mcastcode; -global $mcastlistport, $mcasttimeout, $allowgen; +global $mcastlistport, $mcasttimeout, $mcastretries, $allowgen; global $rigipsecurity, $rigtotals, $forcerigtotals; global $socksndtimeoutsec, $sockrcvtimeoutsec; global $checklastshare, $poolinputs, $hidefields; @@ -70,6 +70,9 @@ $mcastlistport = 4027; # to wait for replies to the Multicast message $mcasttimeout = 1.5; # +# Set $mcastretries to the number of times to retry the multicast +$mcastretries = 0; +# # Set $allowgen to true to allow customsummarypages to use 'gen' # false means ignore any 'gen' options $allowgen = false; @@ -373,10 +376,10 @@ global $haderror, $error; $haderror = false; $error = null; # -function getrigs() +function mcastrigs() { - global $rigs, $mcastaddr, $mcastport, $mcastcode; - global $mcastlistport, $mcasttimeout, $error; + global $rigs, $mcastexpect, $mcastaddr, $mcastport, $mcastcode; + global $mcastlistport, $mcasttimeout, $mcastretries, $error; $listname = "0.0.0.0"; @@ -414,56 +417,78 @@ function getrigs() return; } - $mcast_soc = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); - if ($mcast_soc === false || $mcast_soc == null) + $retries = $mcastretries; + $doretry = ($retries > 0); + do { - $msg = "ERR: mcast send socket create(UDP) failed"; - if ($rigipsecurity === false) + $mcast_soc = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); + if ($mcast_soc === false || $mcast_soc == null) { - $error = socket_strerror(socket_last_error()); - $error = "$msg '$error'\n"; - } - else - $error = "$msg\n"; + $msg = "ERR: mcast send socket create(UDP) failed"; + if ($rigipsecurity === false) + { + $error = socket_strerror(socket_last_error()); + $error = "$msg '$error'\n"; + } + else + $error = "$msg\n"; - socket_close($rep_soc); - return; - } + socket_close($rep_soc); + return; + } - $buf = "cgminer-$mcastcode-$mcastlistport"; - socket_sendto($mcast_soc, $buf, strlen($buf), 0, $mcastaddr, $mcastport); - socket_close($mcast_soc); + $buf = "cgminer-$mcastcode-$mcastlistport"; + socket_sendto($mcast_soc, $buf, strlen($buf), 0, $mcastaddr, $mcastport); + socket_close($mcast_soc); - $stt = microtime(true); - while (true) - { - $got = @socket_recvfrom($rep_soc, $buf, 32, MSG_DONTWAIT, $ip, $p); - if ($got !== false && $got > 0) + $stt = microtime(true); + while (true) { - $ans = explode('-', $buf, 4); - if (count($ans) >= 3 && $ans[0] == 'cgm' && $ans[1] == 'FTW') + $got = @socket_recvfrom($rep_soc, $buf, 32, MSG_DONTWAIT, $ip, $p); + if ($got !== false && $got > 0) { - $rp = intval($ans[2]); + $ans = explode('-', $buf, 4); + if (count($ans) >= 3 && $ans[0] == 'cgm' && $ans[1] == 'FTW') + { + $rp = intval($ans[2]); - if (count($ans) > 3) - $mdes = str_replace("\0", '', $ans[3]); - else - $mdes = ''; + if (count($ans) > 3) + $mdes = str_replace("\0", '', $ans[3]); + else + $mdes = ''; - if (strlen($mdes) > 0) - $rigs[] = "$ip:$rp:$mdes"; - else - $rigs[] = "$ip:$rp"; + if (strlen($mdes) > 0) + $rig = "$ip:$rp:$mdes"; + else + $rig = "$ip:$rp"; + + if (!in_array($rig, $rigs)) + $rigs[] = $rig; + } } + if ((microtime(true) - $stt) >= $mcasttimeout) + break; + + usleep(100000); } - if ((microtime(true) - $stt) >= $mcasttimeout) - break; - usleep(100000); - } + if ($mcastexpect > 0 && count($rigs) >= $mcastexpect) + $doretry = false; + + } while ($doretry && --$retries > 0); + socket_close($rep_soc); } # +function getrigs() +{ + global $rigs; + + mcastrigs(); + + sort($rigs); +} +# function getsock($rig, $addr, $port) { global $rigipsecurity;