Query - Fixed issues, added to server config

This commit is contained in:
manio143 2015-06-20 18:05:53 +02:00
parent 92c5b305dd
commit 64cfe80c98
3 changed files with 41 additions and 35 deletions

View File

@ -92,7 +92,7 @@ namespace TrueCraft
CraftingRepository = craftingRepository; CraftingRepository = craftingRepository;
PendingBlockUpdates = new Queue<BlockUpdate>(); PendingBlockUpdates = new Queue<BlockUpdate>();
EnableClientLogging = false; EnableClientLogging = false;
QueryProtocol = new TrueCraft.QueryProtocol(25566); QueryProtocol = new TrueCraft.QueryProtocol(this);
AccessConfiguration = Configuration.LoadConfiguration<AccessConfiguration>("access.yaml"); AccessConfiguration = Configuration.LoadConfiguration<AccessConfiguration>("access.yaml");
@ -115,14 +115,16 @@ namespace TrueCraft
Log(LogCategory.Notice, "Running TrueCraft server on {0}", EndPoint); Log(LogCategory.Notice, "Running TrueCraft server on {0}", EndPoint);
NetworkWorker.Start(); NetworkWorker.Start();
EnvironmentWorker.Change(100, 1000 / 20); EnvironmentWorker.Change(100, 1000 / 20);
QueryProtocol.Start(); if(Program.ServerConfiguration.Query)
QueryProtocol.Start();
} }
public void Stop() public void Stop()
{ {
ShuttingDown = true; ShuttingDown = true;
Listener.Stop(); Listener.Stop();
QueryProtocol.Stop(); if(Program.ServerConfiguration.Query)
QueryProtocol.Stop();
foreach (var w in Worlds) foreach (var w in Worlds)
w.Save(); w.Save();
foreach (var c in Clients) foreach (var c in Clients)

View File

@ -6,6 +6,7 @@ using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.IO; using System.IO;
using System.Threading; using System.Threading;
using TrueCraft.API.Server;
namespace TrueCraft namespace TrueCraft
{ {
@ -15,22 +16,24 @@ namespace TrueCraft
private int Port; private int Port;
private Timer Timer; private Timer Timer;
private Random Rnd; private Random Rnd;
private IMultiplayerServer Server;
private CancellationTokenSource CToken; private CancellationTokenSource CToken;
private readonly Tuple<byte, byte> ProtocolVersion = new Tuple<byte, byte>(0xFE, 0xFD); private readonly byte[] ProtocolVersion = new byte[] { 0xFE, 0xFD };
private readonly byte Type_Handshake = 0x09; private readonly byte Type_Handshake = 0x09;
private readonly byte Type_Stat = 0x00; private readonly byte Type_Stat = 0x00;
private Dictionary<IPEndPoint, QueryUser> UserList; private Dictionary<IPEndPoint, QueryUser> UserList;
private object UserLock = new object(); private object UserLock = new object();
public QueryProtocol(int port) public QueryProtocol(IMultiplayerServer server)
{ {
Port = port;
Rnd = new Random(); Rnd = new Random();
Server = server;
} }
public void Start() public void Start()
{ {
Port = Program.ServerConfiguration.QueryPort;
Udp = new UdpClient(Port); Udp = new UdpClient(Port);
Timer = new Timer(ResetUserList, null, 0, 30000); Timer = new Timer(ResetUserList, null, 0, 30000);
CToken = new CancellationTokenSource(); CToken = new CancellationTokenSource();
@ -41,16 +44,25 @@ namespace TrueCraft
{ {
if (CToken.IsCancellationRequested) return; if (CToken.IsCancellationRequested) return;
var clientEP = new IPEndPoint(IPAddress.Any, Port); try
byte[] buffer = Udp.EndReceive(ar, ref clientEP);
switch (buffer.Length)
{ {
case 7: HandleHandshake(buffer, clientEP); break; var clientEP = new IPEndPoint(IPAddress.Any, Port);
case 11: HandleBasicStat(buffer, clientEP); break; byte[] buffer = Udp.EndReceive(ar, ref clientEP);
case 15: HandleFullStat(buffer, clientEP); break;
}
if (CheckVersion(buffer))
{
if (buffer[2] == Type_Handshake)
HandleHandshake(buffer, clientEP);
else if (buffer[2] == Type_Stat)
{
if (buffer.Length == 11)
HandleBasicStat(buffer, clientEP);
else if (buffer.Length == 15)
HandleFullStat(buffer, clientEP);
}
}
}
catch { }
if (CToken.IsCancellationRequested) return; if (CToken.IsCancellationRequested) return;
Udp.BeginReceive(HandleReceive, null); Udp.BeginReceive(HandleReceive, null);
@ -59,7 +71,6 @@ namespace TrueCraft
private void HandleHandshake(byte[] buffer, IPEndPoint clientEP) private void HandleHandshake(byte[] buffer, IPEndPoint clientEP)
{ {
var stream = GetStream(buffer); var stream = GetStream(buffer);
CheckHead(Type_Handshake, stream);
int sessionId = GetSessionId(stream); int sessionId = GetSessionId(stream);
var user = new QueryUser { SessionId = sessionId, ChallengeToken = Rnd.Next() }; var user = new QueryUser { SessionId = sessionId, ChallengeToken = Rnd.Next() };
@ -80,7 +91,6 @@ namespace TrueCraft
private void HandleBasicStat(byte[] buffer, IPEndPoint clientEP) private void HandleBasicStat(byte[] buffer, IPEndPoint clientEP)
{ {
var stream = GetStream(buffer); var stream = GetStream(buffer);
CheckHead(Type_Stat, stream);
int sessionId = GetSessionId(stream); int sessionId = GetSessionId(stream);
int token = GetToken(stream); int token = GetToken(stream);
@ -105,7 +115,6 @@ namespace TrueCraft
private void HandleFullStat(byte[] buffer, IPEndPoint clientEP) private void HandleFullStat(byte[] buffer, IPEndPoint clientEP)
{ {
var stream = GetStream(buffer); var stream = GetStream(buffer);
CheckHead(Type_Stat, stream);
int sessionId = GetSessionId(stream); int sessionId = GetSessionId(stream);
int token = GetToken(stream); int token = GetToken(stream);
@ -131,22 +140,9 @@ namespace TrueCraft
SendResponse(response, clientEP); SendResponse(response, clientEP);
} }
private void CheckVersion(BinaryReader stream) private bool CheckVersion(byte[] ver)
{ {
byte ver1 = stream.ReadByte(); return ver[0] == ProtocolVersion[0] && ver[1] == ProtocolVersion[1];
byte ver2 = stream.ReadByte();
if (ver1 != ProtocolVersion.Item1 || ver2 != ProtocolVersion.Item2)
throw new Exception("Incorrect Protocol Version");
}
private void CheckType(byte Type, BinaryReader stream)
{
byte type = stream.ReadByte();
if (type != Type) throw new Exception("Incorrect Type");
}
private void CheckHead(byte Type, BinaryReader stream)
{
CheckVersion(stream);
CheckType(Type, stream);
} }
private int GetSessionId(BinaryReader stream) private int GetSessionId(BinaryReader stream)
{ {
@ -187,8 +183,8 @@ namespace TrueCraft
stats.Add("game_id", "TRUECRAFT"); stats.Add("game_id", "TRUECRAFT");
stats.Add("version", "1.0"); stats.Add("version", "1.0");
stats.Add("plugins", ""); stats.Add("plugins", "");
stats.Add("map", Program.Server.Worlds.First().Name); stats.Add("map", Server.Worlds.First().Name);
stats.Add("numplayers", Program.Server.Clients.Count.ToString()); stats.Add("numplayers", Server.Clients.Count.ToString());
stats.Add("maxplayers", "64"); stats.Add("maxplayers", "64");
stats.Add("hostport", Program.ServerConfiguration.ServerPort.ToString()); stats.Add("hostport", Program.ServerConfiguration.ServerPort.ToString());
stats.Add("hostip", Program.ServerConfiguration.ServerAddress); stats.Add("hostip", Program.ServerConfiguration.ServerAddress);
@ -198,7 +194,7 @@ namespace TrueCraft
{ {
var names = new List<string>(); var names = new List<string>();
lock (Program.Server.ClientLock) lock (Program.Server.ClientLock)
foreach (var client in Program.Server.Clients) foreach (var client in Server.Clients)
names.Add(client.Username); names.Add(client.Username);
return names; return names;
} }

View File

@ -28,6 +28,8 @@ namespace TrueCraft
ServerAddress = "0.0.0.0"; ServerAddress = "0.0.0.0";
WorldSaveInterval = 30; WorldSaveInterval = 30;
Singleplayer = false; Singleplayer = false;
Query = true;
QueryPort = 25566;
} }
[YamlMember(Alias = "motd")] [YamlMember(Alias = "motd")]
@ -47,5 +49,11 @@ namespace TrueCraft
[YamlIgnore] [YamlIgnore]
public bool Singleplayer { get; set; } public bool Singleplayer { get; set; }
[YamlMember(Alias = "query")]
public bool Query { get; set; }
[YamlMember(Alias = "queryPort")]
public int QueryPort { get; set; }
} }
} }