Over the past few weeks I have been working on a multiplayer game that uses Unity’s Master server. At first, My Script worked great and I was able to connect to servers on other computers without a problem. However today I have been trying to use the script but whenever I create a server on one computer and refresh the available servers on another, the unity editor returns the error “Failed to connect to master server at 67.225.180.24:23466” and the server I created does not show up on the server list.
Here is the code I use to connect to the master server:
#pragma strict
DontDestroyOnLoad(this);
var SentSpawnInfo : boolean = false;
var ServerPassword : boolean = false;
var AdditionalInfo : String = " Name";
var Testing : boolean = false;
var TestingIP : boolean = false;
var CreatingServer : boolean = false;
private var gameName = "none";
private var serverName : String = "ServerName";
private var serverTagline : String = "SRVR";
var serverPort = 25002;
var numberOfPlayers : int = 32;
private var playerCount: int = 0;
private var timeoutHostList = 0.0;
private var lastHostListRequest = -1000.0;
private var Username : String = "Username";
private var Password : String = "Password";
private var hostListRefreshTimeout = 10.0;
private var natCapable : ConnectionTesterStatus = ConnectionTesterStatus.Undetermined;
private var filterNATHosts = false;
private var Registering : boolean = false;
private var Timer : float = 0.0;
private var RegisterError : String = "";
private var GameWindowRect = Rect (Screen.width-300,0,300,100);
private var ChatWindowRect = Rect (0,Screen.height-200,300,200);
private var LoggedIn : boolean = false;
private var Text : String = "Hi";
private var Chat : String = "";
private var TestResults = "Detetcting NAT capabilities...";
function OnGUI (){
GameWindowRect = GUILayout.Window (0, GameWindowRect, MakeGameWindow, "Hexic");
}
function Awake (){
natCapable = Network.TestConnection();
if (Network.HavePublicAddress())
Debug.Log("This machine has a public IP address");
else
Debug.Log("This machine has a private IP address");
}
function MakeGameWindow (id : int){
var hideNumberOfPlayers = !Network.isServer;
if (!hideNumberOfPlayers){
GUILayout.Label("Number of player's connected: " + playerCount);
}
GUILayout.Label(TestResults);
if (GUILayout.Button ("Retest connection")){
Debug.Log("Redoing connection test");
TestingIP = false;
Testing = true;
natCapable = Network.TestConnection(true);
}
if (Network.peerType == NetworkPeerType.Disconnected){
GUILayout.Space(10);
if (CreatingServer == false){
GUILayout.BeginHorizontal();
if (GUILayout.Button ("Create Server")){
CreatingServer = true;
}
GUILayout.EndHorizontal ();
}
else if (CreatingServer == true){
ServerPassword = GUILayout.Toggle(ServerPassword, "Enable Password");
if (ServerPassword){
AdditionalInfo = " Name, Server Password";
GUILayout.Space(0);
gameName = GUILayout.TextArea (gameName);
GUILayout.Space(0);
}
else {
gameName = "none";
AdditionalInfo = " Name";
}
serverName = GUILayout.TextArea (serverName);
GUILayout.Space(0);
serverPort = parseInt (GUILayout.TextArea (serverPort.ToString()));
GUILayout.BeginHorizontal ();
GUILayout.Label ("Enter Desired Server" + AdditionalInfo + " And Server Port (From 2000 - 30000)");
GUILayout.EndHorizontal ();
if (GUILayout.Button ("StartServer")){
var useNat = !Network.HavePublicAddress();
Network.InitializeServer(numberOfPlayers, serverPort, useNat);
MasterServer.RegisterHost(gameName, serverName, serverTagline);
CreatingServer = false;
}
}
if (CreatingServer == false){
GUILayout.BeginHorizontal ();
gameName = GUILayout.TextArea (gameName);
GUILayout.Label ("Enter Server Password");
if (GUILayout.Button ("Refresh Available Servers") || Time.realtimeSinceStartup > lastHostListRequest + hostListRefreshTimeout){
MasterServer.RequestHostList (gameName);
lastHostListRequest = Time.realtimeSinceStartup;
}
GUILayout.EndHorizontal();
}
GUILayout.FlexibleSpace();
GUILayout.Space(5);
var data : HostData[] = MasterServer.PollHostList();
for (var element in data){
GUILayout.BeginHorizontal();
if ( !(filterNATHosts)){
var name = element.gameName + " " + element.connectedPlayers + " / " + element.playerLimit;
GUILayout.Label(name);
GUILayout.Space(5);
var hostInfo = "[";
for (var host in element.ip){
hostInfo = hostInfo + host + ":" + element.port + " ";
}
hostInfo = hostInfo + "]";
GUILayout.Label(hostInfo);
GUILayout.Space(5);
GUILayout.Label(element.comment);
GUILayout.Space(5);
GUILayout.FlexibleSpace();
if (GUILayout.Button("Connect")){
Network.Connect(element.ip, element.port);
}
}
GUILayout.EndHorizontal();
}
}
else {
if (GUILayout.Button ("Disconnect")){
Network.Disconnect();
MasterServer.UnregisterHost();
SentSpawnInfo = false;
}
GUILayout.BeginHorizontal ();
if (LoggedIn){
if (GUILayout.Button ("Logout")){
LoggedIn = false;
}
}
if (!LoggedIn){
if (!Registering){
Username = GUILayout.TextArea (Username);
Password = GUILayout.PasswordField (Password, "*"[0], 25);
if (GUILayout.Button ("Login")){
var ValidLogin = PlayerPrefs.HasKey (Username + Password);
if (ValidLogin == true){
LoggedIn = true;
}
else {
GUILayout.Label ("Invalid Username And/Or Password");
}
}
if (GUILayout.Button ("Register")){
Registering = true;
}
if (RegisterError == "Congratulations "+ Username +" You Have Successfuly Registered!"){
GUILayout.Label (RegisterError);
}
}
else if (Registering){
Username = GUILayout.TextArea (Username);
Password = GUILayout.PasswordField (Password, "*"[0], 25);
if (GUILayout.Button ("Finish")){
ValidLogin = PlayerPrefs.HasKey (Username + Password);
if (Username != "Desired Username" && Username != "Username" && Username != ""){
if (Password != "Desired Password" && Password != "Password" && Password != ""){
if (Username != Password){
if (!ValidLogin){
PlayerPrefs.SetString (Username + Password, Username + Password);
RegisterError = "Congratulations "+ Username +
" You Have Successfuly Registered!";
Registering = false;
}
else {
RegisterError = "Username And Password Already Taken.";
}
}
else {
RegisterError = "Username And Password Can't Be The Same.";
}
}
else {
RegisterError = "Password Can't Be *Desired Password*,"+
" *Password* Or Left Blank.";
}
}
else {
RegisterError = "Username Can't Be *Desired Username*,"+
"*Username* Or Left Blank.";
}
}
GUILayout.Label (RegisterError);
if (GUILayout.Button ("Back")){
Registering = false;
}
}
}
GUILayout.EndHorizontal ();
GUILayout.FlexibleSpace();
}
GUI.DragWindow (Rect (0,0,1000,1000));
}
function Update (){
if (!Testing){
TestConnection();
}
if (Network.isClient && SentSpawnInfo == false && LoggedIn == true){
GameObject.Find ("Spawner").SendMessage ("SpawnAPerson");
SentSpawnInfo = true;
}
else if (Network.isServer && SentSpawnInfo == false && LoggedIn == true){
GameObject.Find ("Spawner").SendMessage ("SpawnAPerson");
SentSpawnInfo = true;
}
}
function TestConnection(){
var IPTestResult = Network.TestConnection();
switch (IPTestResult) {
case ConnectionTesterStatus.Error:
TestResults = "Error determining NAT funtionality";
Testing = false;
break;
case ConnectionTesterStatus.Undetermined:
TestResults = "Undetermined NAT functionality";
Testing = false;
break;
case ConnectionTesterStatus.PublicIPIsConnectable:
TestResults = "Connectable IP address.";
var useNat = false;
Testing = false;
break;
case ConnectionTesterStatus.PublicIPPortBlocked:
TestResults = "Unconnectable IP address->Starting " +
"server is impossible.";
useNat = false;
if (!TestingIP) {
IPTestResult = Network.TestConnectionNAT();
TestingIP = true;
var IPStatus = "Trying to bypass blocked IP";
Timer = Time.time + 10;
}
else if (Time.time > Timer) {
TestingIP = false;
useNat = true;
Testing = false;
break;
}
case ConnectionTesterStatus.PublicIPNoServerStarted:
TestResults = "Server Uninitialized->Server must be active"+
" to check accessibility. Retest when server started.";
break;
case ConnectionTesterStatus.LimitedNATPunchthroughPortRestricted:
TestResults = "Limited NAT functionality->Can't connect to "+
"all types of NAT servers. Hosting servers is "+
"not advised.";
useNat = true;
Testing = false;
break;
case ConnectionTesterStatus.LimitedNATPunchthroughSymmetric:
TestResults = "Limited NAT functionality->Can't connect to all "+
"types of NAT servers. Hosting servers is not advised.";
useNat = true;
Testing = false;
break;
case ConnectionTesterStatus.NATpunchthroughFullCone:
TestResults = "Full NAT functionality->Full Server & Client "+
"Connectability.";
useNat = true;
Testing = false;
break;
default:
TestResults = "Error in test, got " + IPTestResult;
}
if (Testing == false){
if (useNat){
var shouldEnableNATMessage = "NAT enabling advised when starting server ";
}
else{
shouldEnableNATMessage = "NAT unneeded";
IPStatus = "Done testing";
}
}
}
function OnPlayerConnected(player: NetworkPlayer){
playerCount += 1;
}
function OnPlayerDisconnected(player: NetworkPlayer){
playerCount -= 1;
Network.RemoveRPCs(player);
Network.DestroyPlayerObjects(player);
}
Any help would be appreciated.