Skip to content

Commit

Permalink
WARNING: Do not use in production. Not finished.
Browse files Browse the repository at this point in the history
  • Loading branch information
NiclasOlofsson committed Jul 21, 2016
1 parent 0ea6862 commit 7cb5fdd
Show file tree
Hide file tree
Showing 8 changed files with 209 additions and 93 deletions.
2 changes: 2 additions & 0 deletions src/MiNET/MiNET/INetworkHandler.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using System.Net;
using MiNET.Net;

namespace MiNET
Expand All @@ -8,5 +9,6 @@ public interface INetworkHandler

void SendPackage(Package package);
void SendDirectPackage(Package package);
IPEndPoint GetClientEndPoint();
}
}
49 changes: 41 additions & 8 deletions src/MiNET/MiNET/LoginMessageHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -321,8 +321,8 @@ protected void DecodeCert(McpeLogin message)

public void HandleMcpeClientMagic(McpeClientMagic message)
{
ServerManager serverManager = _session.Server.ServerManager;
Server server = serverManager.GetServer();
IServerManager serverManager = _session.Server.ServerManager;
IServer server = serverManager.GetServer();

IMcpeMessageHandler messageHandler = server.CreatePlayer(_session, _playerInfo);
_session.MessageHandler = messageHandler; // Replace current message handler with real one.
Expand Down Expand Up @@ -411,21 +411,54 @@ public void HandleMcpeItemFramDropItem(McpeItemFramDropItem message)
}
}

public class ServerManager
public interface IServerManager
{
private Server _getServer = new Server();
IServer GetServer();
}

public interface IServer
{
IMcpeMessageHandler CreatePlayer(INetworkHandler session, PlayerInfo playerInfo);
}

public class DefualtServerManager: IServerManager
{
private readonly MiNetServer _miNetServer;
private IServer _getServer;

public virtual Server GetServer()
protected DefualtServerManager()
{

}

public DefualtServerManager(MiNetServer miNetServer)
{
_miNetServer = miNetServer;
_getServer = new DefaultServer(miNetServer);
}

public virtual IServer GetServer()
{
return _getServer;
}
}

public class Server
public class DefaultServer: IServer
{
public virtual IMcpeMessageHandler CreatePlayer(PlayerNetworkSession session, PlayerInfo playerInfo)
private readonly MiNetServer _server;

protected DefaultServer()
{
}

public DefaultServer(MiNetServer server)
{
_server = server;
}

public virtual IMcpeMessageHandler CreatePlayer(INetworkHandler session, PlayerInfo playerInfo)
{
Player player = session.Server.PlayerFactory.CreatePlayer(session.Server, session.EndPoint);
Player player = _server.PlayerFactory.CreatePlayer(_server, session.GetClientEndPoint());
player.NetworkHandler = session;
player.CertificateData = playerInfo.CertificateData;
player.Username = playerInfo.Username;
Expand Down
155 changes: 77 additions & 78 deletions src/MiNET/MiNET/MiNetServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@ public class MiNetServer
private UdpClient _listener;
private ConcurrentDictionary<IPEndPoint, PlayerNetworkSession> _playerSessions = new ConcurrentDictionary<IPEndPoint, PlayerNetworkSession>();

public bool ForwardAllPlayers { get; set; }
public IPEndPoint ForwardTarget { get; set; }

public MotdProvider MotdProvider { get; set; }

public bool IsSecurityEnabled { get; private set; }
Expand All @@ -41,7 +38,7 @@ public class MiNetServer

public static RecyclableMemoryStreamManager MemoryStreamManager { get; set; } = new RecyclableMemoryStreamManager();

public ServerManager ServerManager { get; set; }
public IServerManager ServerManager { get; set; }
public LevelManager LevelManager { get; set; }
public PlayerFactory PlayerFactory { get; set; }
public GreylistManager GreylistManager { get; set; }
Expand All @@ -57,6 +54,8 @@ public class MiNetServer

public ServerInfo ServerInfo { get; set; }

public ServerRole ServerRole { get; set; } = ServerRole.Full;

internal static DedicatedThreadPool FastThreadPool { get; set; }

public MiNetServer()
Expand All @@ -82,13 +81,13 @@ public bool StartServer()
int iothreads;
ThreadPool.GetMinThreads(out threads, out iothreads);

if (confMinWorkerThreads != -1) threads = confMinWorkerThreads;
else threads *= 4;
//if (confMinWorkerThreads != -1) threads = confMinWorkerThreads;
//else threads *= 4;

if (confMinCompletionPortThreads != -1) iothreads = confMinCompletionPortThreads;
else iothreads *= 4;
//if (confMinCompletionPortThreads != -1) iothreads = confMinCompletionPortThreads;
//else iothreads *= 4;

ThreadPool.SetMinThreads(threads, iothreads);
//ThreadPool.SetMinThreads(threads, iothreads);
FastThreadPool = new DedicatedThreadPool(new DedicatedThreadPoolSettings(threads));

if (_listener != null) return false; // Already started
Expand All @@ -99,87 +98,80 @@ public bool StartServer()

InacvitityTimeout = Config.GetProperty("InactivityTimeout", 8500);

if (Endpoint == null)
if (ServerRole == ServerRole.Full || ServerRole == ServerRole.Proxy)
{
var ip = IPAddress.Parse(Config.GetProperty("ip", "0.0.0.0"));
int port = Config.GetProperty("port", 19132);
Endpoint = new IPEndPoint(ip, port);
if (Endpoint == null)
{
var ip = IPAddress.Parse(Config.GetProperty("ip", "0.0.0.0"));
int port = Config.GetProperty("port", 19132);
Endpoint = new IPEndPoint(ip, port);
}
}

ForwardAllPlayers = Config.GetProperty("ForwardAllPlayers", false);
if (ForwardAllPlayers)
ServerManager = ServerManager ?? new DefualtServerManager(this);

if (ServerRole == ServerRole.Full || ServerRole == ServerRole.Node)
{
var ip = IPAddress.Parse(Config.GetProperty("ForwardIP", "127.0.0.1"));
int port = Config.GetProperty("ForwardPort", 19132);
ForwardTarget = new IPEndPoint(ip, port);
}
Log.Info("Loading plugins...");
PluginManager = new PluginManager();
PluginManager.LoadPlugins();
Log.Info("Plugins loaded!");

ServerManager = new ServerManager();
// Bootstrap server
PluginManager.ExecuteStartup(this);

Log.Info("Loading plugins...");
PluginManager = new PluginManager();
PluginManager.LoadPlugins();
Log.Info("Plugins loaded!");
GreylistManager = GreylistManager ?? new GreylistManager(this);
SessionManager = SessionManager ?? new SessionManager();
LevelManager = LevelManager ?? new LevelManager();
PlayerFactory = PlayerFactory ?? new PlayerFactory();

// Bootstrap server
PluginManager.ExecuteStartup(this);
PluginManager.EnablePlugins(this, LevelManager);

MotdProvider = MotdProvider ?? new MotdProvider();

IsSecurityEnabled = Config.GetProperty("EnableSecurity", false);
if (IsSecurityEnabled)
{
// http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity
UserManager = UserManager ?? new UserManager<User>(new DefaultUserStore());
RoleManager = RoleManager ?? new RoleManager<Role>(new DefaultRoleStore());
// Cache - remove
LevelManager.GetLevel(null, "Default");
}

GreylistManager = GreylistManager ?? new GreylistManager(this);
SessionManager = SessionManager ?? new SessionManager();
LevelManager = LevelManager ?? new LevelManager();
PlayerFactory = PlayerFactory ?? new PlayerFactory();

PluginManager.EnablePlugins(this, LevelManager);

// Cache - remove
LevelManager.GetLevel(null, "Default");

_listener = new UdpClient(Endpoint);
MotdProvider = MotdProvider ?? new MotdProvider();

if (IsRunningOnMono())
if (ServerRole == ServerRole.Full || ServerRole == ServerRole.Proxy)
{
_listener.Client.ReceiveBufferSize = 1024*1024*3;
_listener.Client.SendBufferSize = 4096;
}
else
{
//_listener.Client.ReceiveBufferSize = 1600*40000;
_listener.Client.ReceiveBufferSize = int.MaxValue;
//_listener.Client.SendBufferSize = 1600*40000;
_listener.Client.SendBufferSize = int.MaxValue;
_listener.DontFragment = false;
_listener.EnableBroadcast = false;

// SIO_UDP_CONNRESET (opcode setting: I, T==3)
// Windows: Controls whether UDP PORT_UNREACHABLE messages are reported.
// - Set to TRUE to enable reporting.
// - Set to FALSE to disable reporting.

uint IOC_IN = 0x80000000;
uint IOC_VENDOR = 0x18000000;
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
_listener.Client.IOControl((int) SIO_UDP_CONNRESET, new byte[] {Convert.ToByte(false)}, null);

//
//WARNING: We need to catch errors here to remove the code above.
//
}
_listener = new UdpClient(Endpoint);

_ackTimer = new Timer(SendAckQueue, null, 0, 10);
_cleanerTimer = new Timer(Update, null, 10, Timeout.Infinite);
if (IsRunningOnMono())
{
_listener.Client.ReceiveBufferSize = 1024*1024*3;
_listener.Client.SendBufferSize = 4096;
}
else
{
//_listener.Client.ReceiveBufferSize = 1600*40000;
_listener.Client.ReceiveBufferSize = int.MaxValue;
//_listener.Client.SendBufferSize = 1600*40000;
_listener.Client.SendBufferSize = int.MaxValue;
_listener.DontFragment = false;
_listener.EnableBroadcast = false;

// SIO_UDP_CONNRESET (opcode setting: I, T==3)
// Windows: Controls whether UDP PORT_UNREACHABLE messages are reported.
// - Set to TRUE to enable reporting.
// - Set to FALSE to disable reporting.

uint IOC_IN = 0x80000000;
uint IOC_VENDOR = 0x18000000;
uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
_listener.Client.IOControl((int) SIO_UDP_CONNRESET, new byte[] {Convert.ToByte(false)}, null);

//
//WARNING: We need to catch errors here to remove the code above.
//
}

_listener.BeginReceive(ReceiveCallback, _listener);
_ackTimer = new Timer(SendAckQueue, null, 0, 10);
_cleanerTimer = new Timer(Update, null, 10, Timeout.Infinite);

_listener.BeginReceive(ReceiveCallback, _listener);
}
// Measure latency through system
//_internalPingTimer = new Timer(delegate(object state)
//{
Expand All @@ -198,7 +190,7 @@ public bool StartServer()
};
ServerInfo.MaxNumberOfConcurrentConnects = Config.GetProperty("MaxNumberOfConcurrentConnects", ServerInfo.MaxNumberOfPlayers);

Log.Info("Server open for business on port " + Endpoint.Port + " ...");
Log.Info("Server open for business on port " + Endpoint?.Port + " ...");

return true;
}
Expand Down Expand Up @@ -383,7 +375,7 @@ private void ProcessMessage(byte[] receiveBytes, IPEndPoint senderEndpoint)
// )
{
EnqueueAck(playerSession, package._datagramSequenceNumber);
if(Log.IsDebugEnabled) Log.Debug("ACK on #" + package._datagramSequenceNumber.IntValue());
if (Log.IsDebugEnabled) Log.Debug("ACK on #" + package._datagramSequenceNumber.IntValue());
}

HandleConnectedPackage(playerSession, package);
Expand Down Expand Up @@ -821,7 +813,7 @@ private void HandleNak(PlayerNetworkSession session, byte[] receiveBytes)

session.Rtt = (long) (RTT*0.875 + rtt*0.125);
session.RttVar = (long) (RTTVar*0.875 + Math.Abs(RTT - rtt)*0.125);
session.Rto = session.Rtt + 4* session.RttVar + 100; // SYNC time in the end
session.Rto = session.Rtt + 4*session.RttVar + 100; // SYNC time in the end

FastThreadPool.QueueUserWorkItem(delegate
{
Expand Down Expand Up @@ -877,7 +869,7 @@ private void HandleAck(PlayerNetworkSession session, byte[] receiveBytes)

session.Rtt = (long) (RTT*0.875 + rtt*0.125);
session.RttVar = (long) (RTTVar*0.875 + Math.Abs(RTT - rtt)*0.125);
session.Rto = session.Rtt + 4* session.RttVar + 100; // SYNC time in the end
session.Rto = session.Rtt + 4*session.RttVar + 100; // SYNC time in the end

datagram.PutPool();
}
Expand Down Expand Up @@ -1183,4 +1175,11 @@ private static void TraceSend(Package message)
Log.DebugFormat("< Send: {0}: {1} (0x{0:x2})", message.Id, message.GetType().Name);
}
}

public enum ServerRole
{
Node,
Proxy,
Full,
}
}
59 changes: 59 additions & 0 deletions src/MiNET/MiNET/Net/MCPE Protocol.cs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,15 @@ public static Package CreatePackage(byte messageId, byte[] buffer, string ns)
package.Decode(buffer);
return package;
}
} else if(ns == "ftl") {
switch (messageId)
{
case 0x01:
package = FtlCreatePlayer.CreateObject();
//package.Timer.Start();
package.Decode(buffer);
return package;
}
} else {

switch (messageId)
Expand Down Expand Up @@ -4096,5 +4105,55 @@ protected override void DecodePackage()

}

public partial class FtlCreatePlayer : Package<FtlCreatePlayer>
{
public string username; // = null;
public UUID clientuuid; // = null;
public string serverAddress; // = null;
public long clientId; // = null;
public Skin skin; // = null;
public FtlCreatePlayer()
{
Id = 0x01;
}

protected override void EncodePackage()
{
base.EncodePackage();

BeforeEncode();

Write(username);
Write(clientuuid);
Write(serverAddress);
Write(clientId);
Write(skin);

AfterEncode();
}

partial void BeforeEncode();
partial void AfterEncode();

protected override void DecodePackage()
{
base.DecodePackage();

BeforeDecode();

username = ReadString();
clientuuid = ReadUUID();
serverAddress = ReadString();
clientId = ReadLong();
skin = ReadSkin();

AfterDecode();
}

partial void BeforeDecode();
partial void AfterDecode();

}

}

Loading

0 comments on commit 7cb5fdd

Please sign in to comment.