HI1Proxy/Hi1Proxy/Program.cs

213 lines
7.4 KiB
C#

using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Hi1Proxy
{
class Program
{
static Socket hi1Mitm = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public static MapForm mpForm;
static bool isWaiting = true;
static void AcceptConnection(ConsoleColor recv, ConsoleColor resp, bool gameServer)
{
Socket hi1MitmClient = hi1Mitm.Accept();
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Client: " + hi1MitmClient.RemoteEndPoint);
Socket realHi1Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.ForegroundColor = ConsoleColor.White;
realHi1Server.Connect(IPAddress.Parse("216.98.148.63"), 443);
Console.WriteLine("Server: "+realHi1Server.RemoteEndPoint);
Thread ClientToServer = new Thread(() =>
{
MemoryStream ms = new MemoryStream();
while (true)
{
try
{
if (gameServer)
{
HI1Protocal.Hi1Client = hi1MitmClient;
HI1Protocal.HI1Server = realHi1Server;
}
while (hi1MitmClient.Available >= 1)
{
byte[] buffer = new byte[hi1MitmClient.Available];
hi1MitmClient.Receive(buffer);
foreach (Byte b in buffer)
{
ms.WriteByte(b);
if (b == 0x00)
{
ms.Seek(0x00, SeekOrigin.Begin);
byte[] sendTo = ms.ToArray();
if (HI1Protocal.ParseClientRequestPacket(sendTo))
{
realHi1Server.Send(sendTo);
Console.ForegroundColor = recv;
}
ms.Close();
ms = new MemoryStream();
}
}
}
}
catch (Exception e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(e.Message);
hi1MitmClient.Close();
realHi1Server.Close();
break;
}
}
});
Thread ServerToClient = new Thread(() =>
{
MemoryStream ms = new MemoryStream();
while (true)
{
try
{
if (gameServer)
{
HI1Protocal.Hi1Client = hi1MitmClient;
HI1Protocal.HI1Server = realHi1Server;
}
if (realHi1Server.Available >= 1)
{
byte[] buffer = new byte[realHi1Server.Available];
realHi1Server.Receive(buffer);
foreach(Byte b in buffer)
{
ms.WriteByte(b);
if (b == 0x00)
{
ms.Seek(0x00, SeekOrigin.Begin);
byte[] respondWith = ms.ToArray();
if (HI1Protocal.ParseHi1ResponsePackets(respondWith))
{
hi1MitmClient.Send(respondWith);
}
Console.ForegroundColor = recv;
ms.Close();
ms = new MemoryStream();
}
}
}
}
catch (Exception e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(e.Message);
hi1MitmClient.Close();
realHi1Server.Close();
break;
}
}
});
ClientToServer.Start();
ServerToClient.Start();
if (gameServer == false)
{
isWaiting = false;
}
while (ClientToServer.IsAlive == true) { };
}
static void Main(string[] args)
{
if(File.Exists("MapData.bmp"))
{
Bitmap nMapData = new Bitmap("MapData.bmp");
for(int x = 0; x < nMapData.Width; x++)
{
for(int y = 0; y < nMapData.Height; y++)
{
HI1Protocal.MapData.SetPixel(x, y, nMapData.GetPixel(x, y));
}
}
nMapData.Dispose();
}
if (File.Exists("oMapData.bmp"))
{
Bitmap nMapData = new Bitmap("oMapData.bmp");
for (int x = 0; x < nMapData.Width; x++)
{
for (int y = 0; y < nMapData.Height; y++)
{
HI1Protocal.oMapData.SetPixel(x, y, nMapData.GetPixel(x, y));
}
}
nMapData.Dispose();
}
/*
HI1Protocal.RebuildMapPngFromDb();*/
int PORT = 443;
string IP = "0.0.0.0";
hi1Mitm = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress hostIP = IPAddress.Parse(IP);
IPEndPoint ep = new IPEndPoint(hostIP, PORT);
hi1Mitm.Bind(ep);
hi1Mitm.Listen(10000);
/*
new Thread(() =>
{
try
{
mpForm = new MapForm();
mpForm.ShowDialog();
}
catch(Exception)
{
}
}).Start();*/
Thread AcceptConnection1 = new Thread(() =>
{
AcceptConnection(ConsoleColor.Yellow, ConsoleColor.Magenta, false);
});
AcceptConnection1.Start();
Thread AcceptConnection2 = new Thread(() =>
{
Console.WriteLine("Waiting for 1st connection.");
while (isWaiting) { }
Console.WriteLine("Accepting connections!");
AcceptConnection(ConsoleColor.Cyan, ConsoleColor.Green, true);
});
AcceptConnection2.Start();
}
}
}