dtlauncher/.old 5/dtlauncher-server-win/Program.cs

122 lines
4.8 KiB
C#

using DTLib;
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using static DTLib.NetWork;
namespace dtlauncher_server
{
class Program
{
static Socket mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(string[] args)
{
while (true)
{
try
{
Console.Title = "dtlauncher server";
PublicLog.LogDel += Log;
Log("b", $"<{FileWork.ReadFromConfig("server.cfg", "server ip")}:{FileWork.ReadFromConfig("server.cfg", "server port")}>\n");
mainSocket.Bind(new IPEndPoint(IPAddress.Parse(
FileWork.ReadFromConfig("server.cfg", "server ip")),
FileWork.ReadFromConfig("server.cfg", "server port").ToInt()));
Log("g", "server started succesfully\n");
mainSocket.Listen(1000);
while (true)
{
var userSocket = mainSocket.Accept();
var userThread = new Thread(new ParameterizedThreadStart(UserHandle));
//users.Add(userSocket, userThread);
userThread.Start(userSocket);
}
}
catch (Exception ex)
{
if (mainSocket.IsBound)
{
mainSocket.Shutdown(SocketShutdown.Both);
mainSocket.Close();
}
Log("r", $"dtlauncher_server.Main() error:\n{ex.Message}\n{ex.StackTrace}\n");
}
Log("gray", "\n");
}
}
// лог в консоль и файл
static readonly string logfile = $"logs\\dtlauncher-server-{DateTime.Now}.log".Replace(':', '-').Replace(' ', '_');
static void Log(params string[] msg)
{
lock (new object())
{
if (msg.Length == 1)
{
msg[0] = "[" + DateTime.Now.ToString() + "]: " + msg[0];
FileWork.Log(logfile, msg[0]);
}
else if (msg.Length % 2 != 0) throw new Exception("incorrect array to log\n");
else
{
msg[1] = "[" + DateTime.Now.ToString() + "]: " + msg[1];
var str = new System.Text.StringBuilder();
for (int i = 0; i < msg.Length; i++) str.Append(msg[++i]);
FileWork.Log(logfile, str.ToString());
}
ColoredConsole.Write(msg);
}
}
// запускается для каждого юзера в отдельном потоке
static void UserHandle(object _handlerSocket)
{
Log("g", "user connecting\n");
Socket handlerSocket = (Socket)_handlerSocket;
try
{
handlerSocket.SendPackage(16, "requesting hash".ToBytes());
string login;
lock (new object())
{
login = FileWork.ReadFromConfig("users.db", handlerSocket.GetPackageRaw(32).HashToString());
}
handlerSocket.SendPackage(16, "success".ToBytes());
Log("g", $"user <{login}> succesfully logged\n");
while (true)
{
if (handlerSocket.Available >= 64)
{
var request = handlerSocket.GetPackageClear(64).ToStr();
switch (request)
{
// ответ на NetWork.Ping()
/*case "ping":
handlerSocket.Send("pong".ToBytes());
break;*/
// отправка списка активных серверов
/*case "requesting servers list":
break;*/
case "requesting file download":
handlerSocket.FSP_Upload();
break;
default:
throw new Exception("unknown request: " + request);
}
}
else Thread.Sleep(10);
}
}
catch (Exception ex)
{
Log("y", $"UserStart() error:\n message:\n {ex.Message}\n{ex.StackTrace}\n");
handlerSocket.Shutdown(SocketShutdown.Both);
handlerSocket.Close();
Thread.CurrentThread.Abort();
}
}
}
}