Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
  • Loading branch information
krisdb2009 committed Jan 14, 2024
1 parent e9ca101 commit 99cc86b
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 12 deletions.
83 changes: 74 additions & 9 deletions Tikhole.Engine/Forwarder.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
using System.Net;
using System.Collections;
using System.Net;
using System.Net.Sockets;

namespace Tikhole.Engine
{
public class Forwarder
public class Forwarder : IDisposable
{
public static IPEndPoint DNSServer = new(IPAddress.Parse("1.1.1.1"), 53);
private static Director Director = new();
public event EventHandler<RecievedResponseDataEventArgs>? RecievedResponseData;
public Forwarder()
{
Expand All @@ -15,18 +17,81 @@ public Forwarder()
private void Listener_RecievedRequestData(object? sender, RecievedRequestDataEventArgs e)
{
if (Logger.VerboseMode) Logger.Verbose("Recieved request from " + e.IPEndPoint.ToString() + ", forwarding to " + DNSServer.ToString() + "...");
IPEndPoint? responseEndPoint = null;
UdpClient udpClient = new();
udpClient.Connect(DNSServer);
udpClient.Send(e.Data);
byte[] responseBytes = udpClient.Receive(ref responseEndPoint);
udpClient.Close();
RecievedResponseData?.Invoke(null, new() { RecievedRequestData = e, Data = responseBytes});
byte[]? response = Director.Forward(e.Data);
if (response == null)
{
Logger.Info("Request from " + e.IPEndPoint.ToString() + " timed out or experienced an error when sent to " + DNSServer.ToString() + ".");
return;
}
RecievedResponseData?.Invoke(null, new() { RecievedRequestData = e, Data = response });
}
public void Dispose()
{
Director.Dispose();
}
}
public class RecievedResponseDataEventArgs : EventArgs
{
public required RecievedRequestDataEventArgs RecievedRequestData;
public required byte[] Data;
}
public class Director : IDisposable
{
private UdpClient Client = new UdpClient();
private Dictionary<UInt16, Request> Requests = new();
private SemaphoreSlim Semaphore = new(1);
public Director()
{
Task.Run(() => {
while (Client.Client.Poll(-1, SelectMode.SelectRead))
{
IPEndPoint? endpoint = null;
byte[] received = Client.Receive(ref endpoint);
UInt16 ID = GetID(received);
Semaphore.Wait();
if (Requests.ContainsKey(ID))
{
Requests[ID].Response = received;
Requests[ID].WaitHandle?.Set();
}
Semaphore.Release();
}
});
}
public byte[]? Forward(byte[] Request)
{
UInt16 ID = GetID(Request);
EventWaitHandle waitHandle = new(false, EventResetMode.ManualReset);
Semaphore.Wait();
if (Requests.ContainsKey(ID))
{
Semaphore.Release();
return null;
}
Requests.Add(ID, new() { WaitHandle = waitHandle });
Semaphore.Release();
Client.Send(Request, Forwarder.DNSServer);
waitHandle.WaitOne(1000);
waitHandle.Dispose();
Semaphore.Wait();
byte[]? response = Requests[ID].Response;
Requests.Remove(ID);
Semaphore.Release();
return response;
}
private UInt16 GetID(byte[] Request)
{
return BitConverter.ToUInt16(Request, 0);
}
public void Dispose()
{
Semaphore.Dispose();
Client.Dispose();
}
private record Request
{
public EventWaitHandle? WaitHandle;
public byte[]? Response;
}
}
}
1 change: 1 addition & 0 deletions Tikhole.Engine/Tikhole.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public Tikhole()
public void Dispose()
{
Listener?.Dispose();
Forwarder?.Dispose();
foreach (Rule rule in Matcher.Rules) rule.Dispose();
if (Committers != null) foreach (Committer c in Committers) c.Dispose();
}
Expand Down
5 changes: 2 additions & 3 deletions benchmark_specified.ps1
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
function Start-Test($Domains) {
function Start-Test() {
$before = [DateTime]::Now.Ticks / [TimeSpan]::TicksPerMillisecond
$_ = Resolve-DnsName -Name example.com -Server 127.0.0.1 -ErrorAction SilentlyContinue -QuickTimeout
$after = [DateTime]::Now.Ticks / [TimeSpan]::TicksPerMillisecond
"$($after - $before) ms"
}
$domains = Get-DomainList
while ($true) {
Start-Test -Domains $domains
Start-Test
}

0 comments on commit 99cc86b

Please sign in to comment.