WindivertDotnet异步

This commit is contained in:
陈国伟 2022-10-13 12:28:18 +08:00
parent d976cf58e5
commit aa99fdafac
3 changed files with 14 additions and 20 deletions

View File

@ -60,8 +60,6 @@ namespace FastGithub.PacketIntercept.Dns
/// <returns></returns> /// <returns></returns>
public async Task InterceptAsync(CancellationToken cancellationToken) public async Task InterceptAsync(CancellationToken cancellationToken)
{ {
await Task.Yield();
using var divert = new WinDivert(filter, WinDivertLayer.Network); using var divert = new WinDivert(filter, WinDivertLayer.Network);
cancellationToken.Register(d => cancellationToken.Register(d =>
{ {
@ -69,16 +67,16 @@ namespace FastGithub.PacketIntercept.Dns
DnsFlushResolverCache(); DnsFlushResolverCache();
}, divert); }, divert);
var addr = new WinDivertAddress();
using var packet = new WinDivertPacket(); using var packet = new WinDivertPacket();
using var addr = new WinDivertAddress();
DnsFlushResolverCache(); DnsFlushResolverCache();
while (cancellationToken.IsCancellationRequested == false) while (cancellationToken.IsCancellationRequested == false)
{ {
divert.Recv(packet, ref addr); await divert.RecvAsync(packet, addr);
try try
{ {
this.ModifyDnsPacket(packet, ref addr); this.ModifyDnsPacket(packet, addr);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -86,7 +84,7 @@ namespace FastGithub.PacketIntercept.Dns
} }
finally finally
{ {
divert.Send(packet, ref addr); await divert.SendAsync(packet, addr);
} }
} }
} }
@ -96,7 +94,7 @@ namespace FastGithub.PacketIntercept.Dns
/// </summary> /// </summary>
/// <param name="packet"></param> /// <param name="packet"></param>
/// <param name="addr"></param> /// <param name="addr"></param>
unsafe private void ModifyDnsPacket(WinDivertPacket packet, ref WinDivertAddress addr) unsafe private void ModifyDnsPacket(WinDivertPacket packet, WinDivertAddress addr)
{ {
var result = packet.GetParseResult(); var result = packet.GetParseResult();
var requestPayload = result.DataSpan.ToArray(); var requestPayload = result.DataSpan.ToArray();
@ -162,9 +160,9 @@ namespace FastGithub.PacketIntercept.Dns
else else
{ {
addr.Flags ^= WinDivertAddressFlag.Outbound; addr.Flags ^= WinDivertAddressFlag.Outbound;
} }
packet.CalcChecksums(ref addr); packet.CalcChecksums(addr);
this.logger.LogInformation($"{domain}->{loopback}"); this.logger.LogInformation($"{domain}->{loopback}");
} }

View File

@ -7,7 +7,7 @@
<ItemGroup> <ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" /> <FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="DNS" Version="7.0.0" /> <PackageReference Include="DNS" Version="7.0.0" />
<PackageReference Include="WindivertDotnet" Version="1.0.0-beta2" /> <PackageReference Include="WindivertDotnet" Version="1.0.0-rc3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -50,8 +50,6 @@ namespace FastGithub.PacketIntercept.Tcp
return; return;
} }
await Task.Yield();
using var divert = new WinDivert(this.filter, WinDivertLayer.Network, 0, WinDivertFlag.None); using var divert = new WinDivert(this.filter, WinDivertLayer.Network, 0, WinDivertFlag.None);
if (Socket.OSSupportsIPv4) if (Socket.OSSupportsIPv4)
{ {
@ -63,16 +61,14 @@ namespace FastGithub.PacketIntercept.Tcp
} }
cancellationToken.Register(d => ((WinDivert)d!).Dispose(), divert); cancellationToken.Register(d => ((WinDivert)d!).Dispose(), divert);
var addr = new WinDivertAddress();
using var packet = new WinDivertPacket(); using var packet = new WinDivertPacket();
using var addr = new WinDivertAddress();
while (cancellationToken.IsCancellationRequested == false) while (cancellationToken.IsCancellationRequested == false)
{ {
addr.Clear(); await divert.RecvAsync(packet, addr);
divert.Recv(packet, ref addr);
try try
{ {
this.ModifyTcpPacket(packet, ref addr); this.ModifyTcpPacket(packet, addr);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -80,7 +76,7 @@ namespace FastGithub.PacketIntercept.Tcp
} }
finally finally
{ {
divert.Send(packet, ref addr); await divert.SendAsync(packet, addr);
} }
} }
} }
@ -90,7 +86,7 @@ namespace FastGithub.PacketIntercept.Tcp
/// </summary> /// </summary>
/// <param name="packet"></param> /// <param name="packet"></param>
/// <param name="addr"></param> /// <param name="addr"></param>
unsafe private void ModifyTcpPacket(WinDivertPacket packet, ref WinDivertAddress addr) unsafe private void ModifyTcpPacket(WinDivertPacket packet, WinDivertAddress addr)
{ {
var result = packet.GetParseResult(); var result = packet.GetParseResult();
if (result.IPV4Header != null && result.IPV4Header->SrcAddr.Equals(IPAddress.Loopback) == false) if (result.IPV4Header != null && result.IPV4Header->SrcAddr.Equals(IPAddress.Loopback) == false)
@ -111,7 +107,7 @@ namespace FastGithub.PacketIntercept.Tcp
result.TcpHeader->SrcPort = oldServerPort; result.TcpHeader->SrcPort = oldServerPort;
} }
addr.Flags |= WinDivertAddressFlag.Impostor; addr.Flags |= WinDivertAddressFlag.Impostor;
packet.CalcChecksums(ref addr); packet.CalcChecksums(addr);
} }
} }
} }