This repository has been archived on 2023-04-11. You can view files and clone it, but cannot push or open issues or pull requests.

125 lines
3.6 KiB
C#
Raw Normal View History

2020-05-09 09:49:52 -04:00
using System;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
2020-05-09 09:49:52 -04:00
using System.Net;
using System.Net.Sockets;
using Amazon.ECS;
using Amazon.ECS.Model;
using System.Collections.Generic;
2020-05-09 09:49:52 -04:00
class AuthServer
{
private bool running = false;
2020-05-09 09:49:52 -04:00
private int port;
private Thread thread;
2020-05-09 09:49:52 -04:00
private IPAddress address;
// Core objects
2020-05-09 09:49:52 -04:00
private TcpListener server;
private Redis redis;
private AmazonECSClient ecs;
2020-05-09 09:49:52 -04:00
public AuthServer(string addr = "0.0.0.0", int p = 7778)
{
port = p;
address = IPAddress.Parse(addr);
redis = new Redis(Environment.GetEnvironmentVariable("REDIS_HOSTNAME"));
2020-05-09 09:49:52 -04:00
server = new TcpListener(address, port);
ecs = new AmazonECSClient();
2020-05-09 09:49:52 -04:00
}
2020-05-21 21:20:06 -04:00
private Amazon.ECS.Model.Task GetTask(string task_arn)
{
// Builds ECS Request
DescribeTasksRequest r = new DescribeTasksRequest();
List<string> tasks = new List<string>();
tasks.Add(task_arn);
r.Tasks = tasks;
//Send Describe Tasks Request
var t = ecs.DescribeTasksAsync(r);
t.RunSynchronously();
//Return result
return t.Result.Tasks[0];
}
2020-05-09 09:49:52 -04:00
private void ServerLoop()
{
while(running)
{
try
{
//Wait for connection
TcpClient client = server.AcceptTcpClient();
//Get remote address
IPEndPoint endPoint = (IPEndPoint) client.Client.RemoteEndPoint;
Console.WriteLine(endPoint.Address.ToString() + " connected!");
2020-05-09 09:49:52 -04:00
//Create streams
NetworkStream stream = client.GetStream();
StreamWriter writer = new StreamWriter(stream);
2020-05-09 09:49:52 -04:00
Byte[] bytes = new byte[256];
String data = null;
2020-05-09 09:49:52 -04:00
2020-05-21 21:20:06 -04:00
long num_of_tasks = redis.conn.ListLength("tasks");
2020-05-09 09:49:52 -04:00
2020-05-21 21:20:06 -04:00
if(num_of_tasks > 0)
{
var task = GetTask(redis.conn.ListGetByIndex("tasks",0));
int port = task.Containers[0].NetworkBindings[0].HostPort;
string hostname = task.Containers[0].NetworkBindings[0].BindIP;
writer.Write("server:" + hostname + ":" + port.ToString());
writer.Flush();
Console.WriteLine("Routed client to " + hostname + ":" + port.ToString());
}
else
{
string msg = "ERROR: No valid game server found!";
Console.WriteLine(msg);
writer.Write(msg);
writer.Flush();
}
2020-05-21 21:20:06 -04:00
//Read any client response
int i;
while((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Recieved: {0}", data);
}
client.Close();
Console.WriteLine("Client disconnected");
}
catch(Exception e)
2020-05-09 09:49:52 -04:00
{
Console.WriteLine("Fatal exception: " + e.ToString());
2020-05-09 09:49:52 -04:00
}
}
}
public void Start()
{
server.Start();
running = true;
ThreadStart entrypoint = new ThreadStart(ServerLoop);
thread = new Thread(entrypoint);
thread.Start();
Console.WriteLine("Waiting for a connection...");
2020-05-09 09:49:52 -04:00
}
public void Stop()
{
running = false;
}
public void ForceStop()
{
running = false;
thread.Abort();
2020-05-09 09:49:52 -04:00
}
}