private static void TextMessageReceived(NetworkingPlayer player, Text frame, NetWorker sender) { try { System.Console.WriteLine($"TextMessageReceived() was called."); System.Console.WriteLine($"Call came from player with network-id {player.NetworkId}"); System.Console.WriteLine($"Call data were as follows:"); System.Console.WriteLine($"{frame.ToString()}"); var json = JSON.Parse(frame.ToString()); if (json["register"] != null) { // A host is coming to register with this NAT server, thus declaring itself open for business. // Remember, when the host _itself_ moves through its own firewall it signals to its operating // system that it's safe to do traffic on that port - including _receiving_ traffic directly from clients. string address = player.IPEndPointHandle.Address.ToString(); ushort port = json["register"]["port"].AsUShort; if (!hosts.ContainsKey(address)) { hosts.Add(address, new List <Host>()); } if (CheckAndUpdateRegisteredHost(player, address, port)) { return; } RegisterNewHost(player, address, port); System.Console.WriteLine($"New host was registrered on {address}:{port}"); } else if (json["host"] != null && json["port"] != null) { // A client is coming to register with this NAT server, i.e. it's looking for a host it believes it knows about. // So let's see if we can find a suitable host for it. server.Disconnect(player, false); string addresss = json["host"]; ushort port = json["port"].AsUShort; ushort listeningPort = json["clientPort"].AsUShort; addresss = NetWorker.ResolveHost(addresss, port).Address.ToString(); if (!hosts.ContainsKey(addresss)) { return; } Host foundHost = new Host(); foreach (Host iHost in hosts[addresss]) { if (iHost.port == port) { foundHost = iHost; break; } } if (string.IsNullOrEmpty(foundHost.host)) { return; } JSONNode obj = JSONNode.Parse("{}"); obj.Add("host", new JSONData(player.IPEndPointHandle.Address.ToString().Split(':')[0])); obj.Add("port", new JSONData(listeningPort)); JSONClass sendObj = new JSONClass(); sendObj.Add("nat", obj); Text notifyFrame = Text.CreateFromString(server.Time.Timestep, sendObj.ToString(), false, Receivers.Target, MessageGroupIds.NAT_ROUTE_REQUEST, false); server.Send(foundHost.player, notifyFrame, true); System.Console.WriteLine($"The client was sent info about a host - gg ahead."); } } catch (Exception ex) { System.Console.WriteLine($"An error occured in call to TextMessageReceived()."); System.Console.WriteLine($"Call came from player with network-id {player.NetworkId}."); System.Console.WriteLine($"Error was '{ex.Message}'."); System.Console.WriteLine($"Calling server.Disconnect()."); server.Disconnect(player, true); } }
private static void TextMessageReceived(NetworkingPlayer player, Text frame, NetWorker sender) { try { var json = JSON.Parse(frame.ToString()); if (json["register"] != null) { string address = player.IPEndPointHandle.Address.ToString(); ushort port = json["register"]["port"].AsUShort; if (!hosts.ContainsKey(address)) { hosts.Add(address, new List <Host>()); } foreach (Host host in hosts[address]) { // This host is already registered if (host.port == port) { return; } } System.Console.Write("Hosted Server received: "); System.Console.Write(address); System.Console.Write(":"); System.Console.Write(port); System.Console.Write(" received"); System.Console.Write(System.Environment.NewLine); hosts[address].Add(new Host(player, address, port)); } else if (json["host"] != null && json["port"] != null) { server.Disconnect(player, false); string addresss = json["host"]; ushort port = json["port"].AsUShort; ushort listeningPort = json["clientPort"].AsUShort; addresss = NetWorker.ResolveHost(addresss, port).Address.ToString(); if (!hosts.ContainsKey(addresss)) { return; } Host foundHost = new Host(); foreach (Host iHost in hosts[addresss]) { if (iHost.port == port) { foundHost = iHost; break; } } if (string.IsNullOrEmpty(foundHost.host)) { return; } JSONNode obj = JSONNode.Parse("{}"); obj.Add("host", new JSONData(player.IPEndPointHandle.Address.ToString().Split(':')[0])); obj.Add("port", new JSONData(listeningPort)); JSONClass sendObj = new JSONClass(); sendObj.Add("nat", obj); Text notifyFrame = Text.CreateFromString(server.Time.Timestep, sendObj.ToString(), false, Receivers.Target, MessageGroupIds.NAT_ROUTE_REQUEST, false); server.Send(foundHost.player, notifyFrame, true); } } catch { server.Disconnect(player, true); } }