dtlauncher/minecraft-launcher-client/InternalServer.cs

72 lines
2.5 KiB
C#

using DTLib;
using DTLib.Network;
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Linq;
namespace launcher_client
{
class InternalServer
{
Socket internalServerSocket;
Thread internalServerThread;
public InternalServer()
{
internalServerSocket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
internalServerThread = new(() => Start());
internalServerThread.Start();
}
void Start()
{
internalServerSocket.Bind(new IPEndPoint(IPAddress.Loopback, 38888));
internalServerSocket.Listen(1000);
if (Launcher.debug) Launcher.Log("g", "internal server started\n");
var handlerSocket = internalServerSocket.Accept();
if (Launcher.debug) Launcher.Log("b", "new connection\n");
while (true)
{
try
{
while (true)
{
if (handlerSocket.Available >= 2)
{
var request = handlerSocket.GetPackage().ToString();
switch (request)
{
case "client connecting":
Launcher.Log("c", $"request from client: <{request}>\n");
break;
default:
throw new Exception("unknown request: " + request);
}
}
else Thread.Sleep(10);
}
}
catch (ThreadAbortException)
{
handlerSocket.Shutdown(SocketShutdown.Both);
handlerSocket.Close();
return;
}
catch (Exception ex)
{
Launcher.Log("y", $"InternalServer.Start() error:\n{ex.Message}\n{ex.StackTrace}\n");
}
}
}
public void Stop()
{
if (internalServerSocket.Connected) internalServerSocket.Shutdown(SocketShutdown.Both);
internalServerSocket.Close();
internalServerThread.Abort();
if (Launcher.debug) Launcher.Log("g", "internal server stopped\n");
}
}
}