IEnumerator PingRegion(CloudServerRegion region)
{
// JP can't be pinged at the moment, so we skip it!
if (region == CloudServerRegion.Japan)
{
yield break;
}
string hostname = ServerSettings.FindServerAddressForRegion(region);
string regionIp = ResolveHost(hostname);
if (string.IsNullOrEmpty(regionIp))
{
Debug.LogError("Could not resolve host: " + hostname);
yield break;
}
int averagePing = 0;
int tries = 3;
int skipped = 0;
float timeout = 0.500f; // 500 milliseconds is our max, after this we assume a timeout.
for (int i = 0; i < tries; i++)
{
float startTime = Time.time;
Ping ping = new Ping(regionIp);
while (!ping.isDone && Time.time < startTime + timeout)
{
// Timeout after 500ms: sometimes Unity ping never returns
yield return(0);
}
if (ping.time == -1)
{
if (skipped > 5)
{
averagePing += (int)(timeout * 1000) * tries;
break;
}
else
{
i -= 1; //Sometimes Unity ping doesnt return, we therefor retry a few times..
skipped++;
continue;
}
}
averagePing += ping.time;
}
int regionAverage = averagePing / tries;
//Debug.LogWarning (hostname + ": " + average + "ms");
if (regionAverage < lowestRegionAverage || lowestRegionAverage == -1)
{
lowestRegionAverage = regionAverage;
SetRegion(region);
}
}