diff --git a/Netch/Netch.csproj b/Netch/Netch.csproj
index 467f830a..7ac149e9 100644
--- a/Netch/Netch.csproj
+++ b/Netch/Netch.csproj
@@ -51,11 +51,12 @@
-
+
+
diff --git a/Netch/Utils/Utils.cs b/Netch/Utils/Utils.cs
index 74d4f57c..92acbc1f 100644
--- a/Netch/Utils/Utils.cs
+++ b/Netch/Utils/Utils.cs
@@ -139,14 +139,14 @@ namespace Netch.Utils
public static bool SearchOutboundAdapter(bool logging = true)
{
// 寻找出口适配器
- if (Win32Native.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse("114.114.114.114").GetAddressBytes(), 0),
+ if (Vanara.PInvoke.IpHlpApi.GetBestRoute(BitConverter.ToUInt32(IPAddress.Parse("114.114.114.114").GetAddressBytes(), 0),
0, out var pRoute) != 0)
{
Logging.Error("GetBestRoute 搜索失败");
return false;
}
- Global.Outbound.Index = pRoute.dwForwardIfIndex;
+ Global.Outbound.Index = (int) pRoute.dwForwardIfIndex;
// 根据 IP Index 寻找 出口适配器
try
{
@@ -162,7 +162,7 @@ namespace Netch.Utils
}
});
Global.Outbound.Adapter = adapter;
- Global.Outbound.Gateway = new IPAddress(pRoute.dwForwardNextHop);
+ Global.Outbound.Gateway = new IPAddress(pRoute.dwForwardNextHop.S_un_b);
if (logging)
{
Logging.Info($"出口 IPv4 地址:{Global.Outbound.Address}");
diff --git a/Netch/Win32Native.cs b/Netch/Win32Native.cs
index 46dbd8f5..af732b2b 100644
--- a/Netch/Win32Native.cs
+++ b/Netch/Win32Native.cs
@@ -1,347 +1,11 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Net.NetworkInformation;
using System.Runtime.InteropServices;
-using System.Text;
namespace Netch
{
public static class Win32Native
{
- public enum ForwardType
- {
- Other = 1,
- Invalid = 2,
- Direct = 3,
- Indirect = 4
- }
-
- public enum ForwardProtocol
- {
- Other = 1,
- Local = 2,
- NetMGMT = 3,
- ICMP = 4,
- EGP = 5,
- GGP = 6,
- Hello = 7,
- RIP = 8,
- IS_IS = 9,
- ES_IS = 10, // 0x0000000A
- CISCO = 11, // 0x0000000B
- BBN = 12, // 0x0000000C
- OSPF = 13, // 0x0000000D
- BGP = 14, // 0x0000000E
- NT_AUTOSTATIC = 10002, // 0x00002712
- NT_STATIC = 10006, // 0x00002716
- NT_STATIC_NON_DOD = 10007 // 0x00002717
- }
-
- public class RouteEntry
- {
- internal MIB_IPFORWARDROW _ipFwdNative;
- private int _metric1;
- private int _metric2;
- private int _metric3;
- private int _metric4;
- private int _metric5;
- private IPAddress _destination;
- private IPAddress _mask;
- private int _policy;
- private IPAddress _nextHop;
- private NetworkInterface _interface;
- private ForwardProtocol _protocol;
- private ForwardType _type;
- private int _nextHopAS;
- private int _age;
- private int _index;
-
- public int Index
- {
- get => _index;
- set => _index = value;
- }
-
- public IPAddress Destination
- {
- get => _destination;
- set => _destination = value;
- }
-
- public IPAddress Mask
- {
- get => _mask;
- set => _mask = value;
- }
-
- public int Policy
- {
- get => _policy;
- set => _policy = value;
- }
-
- public IPAddress NextHop
- {
- get => _nextHop;
- set => _nextHop = value;
- }
-
- public NetworkInterface RelatedInterface => _interface;
-
- public string InterfaceName
- {
- get
- {
- if (RelatedInterface == null)
- return string.Empty;
- return RelatedInterface.Name;
- }
- }
-
- public ForwardType ForwardType
- {
- get => _type;
- set => _type = value;
- }
-
- public ForwardProtocol Protocol
- {
- get => _protocol;
- set => _protocol = value;
- }
-
- public int Age
- {
- get => _age;
- set => _age = value;
- }
-
- public int NextHopAS
- {
- get => _nextHopAS;
- set => _nextHopAS = value;
- }
-
- public int Metric1
- {
- get => _metric1;
- set => _metric1 = value;
- }
-
- public int Metric2
- {
- get => _metric2;
- set => _metric2 = value;
- }
-
- public int Metric3
- {
- get => _metric3;
- set => _metric3 = value;
- }
-
- public int Metric4
- {
- get => _metric4;
- set => _metric4 = value;
- }
-
- public int Metric5
- {
- get => _metric5;
- set => _metric5 = value;
- }
-
- public RouteEntry(
- uint destination,
- uint mask,
- int policy,
- uint nextHop,
- NetworkInterface intf,
- ForwardType type,
- ForwardProtocol proto,
- int age,
- int nextHopAS,
- int metric1,
- int metric2,
- int metric3,
- int metric4,
- int metric5,
- int idx)
- {
- _age = age;
- _policy = policy;
- _protocol = proto;
- _type = type;
- _destination = new IPAddress(destination);
- _mask = new IPAddress(mask);
- _nextHop = new IPAddress(nextHop);
- _nextHopAS = nextHopAS;
- _interface = intf;
- _metric1 = metric1;
- _metric2 = metric2;
- _metric3 = metric3;
- _metric4 = metric4;
- _metric5 = metric5;
- _index = idx;
- }
- }
-
- [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
- public struct MIB_IFROW
- {
- private const int MAX_INTERFACE_NAME_LEN = 256;
- private const int MAXLEN_IFDESCR = 256;
- private const int MAXLEN_PHYSADDR = 8;
- [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
- public string wszName;
- public int dwIndex;
- public int dwType;
- public int dwMtu;
- public int dwSpeed;
- public int dwPhysAddrLen;
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
- public byte[] bPhysAddr;
- public int dwAdminStatus;
- public int dwOperStatus;
- public int dwLastChange;
- public int dwInOctets;
- public int dwInUcastPkts;
- public int dwInNUcastPkts;
- public int dwInDiscards;
- public int dwInErrors;
- public int dwInUnknownProtos;
- public int dwOutOctets;
- public int dwOutUcastPkts;
- public int dwOutNUcastPkts;
- public int dwOutDiscards;
- public int dwOutErrors;
- public int dwOutQLen;
- public int dwDescrLen;
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
- public byte[] bDescr;
- }
-
- public class AdaptersTable
- {
- private Dictionary _adapters = new Dictionary();
-
- public IDictionary GetAdapters()
- {
- return _adapters;
- }
-
- public NetworkInterface GetAdapter(int interfaceIndex)
- {
- NetworkInterface networkInterface = null;
- _adapters.TryGetValue(interfaceIndex, out networkInterface);
- return networkInterface;
- }
-
- public int GetAdapterIndex(NetworkInterface networkInterface)
- {
- return _adapters.First(a => a.Value == networkInterface).Key;
- }
-
- public AdaptersTable()
- {
- var num1 = IntPtr.Zero;
- var pdwSize = 0;
- var num2 = 0;
- num2 = GetIfTable(IntPtr.Zero, ref pdwSize, true);
- var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
- try
- {
- num1 = Marshal.AllocHGlobal(pdwSize);
- if (GetIfTable(num1, ref pdwSize, true) != 0)
- return;
- var num3 = Marshal.ReadInt32(num1);
- var ptr = new IntPtr(num1.ToInt32() + 4);
- for (var index = 0; index < num3; ++index)
- {
- var structure = (MIB_IFROW)Marshal.PtrToStructure(ptr, typeof(MIB_IFROW));
- var pIfRow = new MIB_IFROW();
- pIfRow.dwIndex = structure.dwIndex;
- if (GetIfEntry(ref pIfRow) == 0)
- {
- var str = Encoding.ASCII.GetString(structure.bDescr, 0, pIfRow.dwDescrLen - 1);
- foreach (var networkInterface in networkInterfaces)
- {
- if (networkInterface.Description == str)
- {
- _adapters.Add(structure.dwIndex, networkInterface);
- break;
- }
- }
- }
- ptr = new IntPtr(ptr.ToInt32() + Marshal.SizeOf(typeof(MIB_IFROW)));
- }
- }
- catch (Exception)
- {
- // ignored
- }
- finally
- {
- Marshal.FreeHGlobal(num1);
- }
- }
- }
-
- public struct MIB_IPFORWARDROW
- {
- public uint dwForwardDest;
- public uint dwForwardMask;
- public int dwForwardPolicy;
- public uint dwForwardNextHop;
- public int dwForwardIfIndex;
- public ForwardType dwForwardType;
- public ForwardProtocol dwForwardProto;
- public int dwForwardAge;
- public int dwForwardNextHopAS;
- public int dwForwardMetric1;
- public int dwForwardMetric2;
- public int dwForwardMetric3;
- public int dwForwardMetric4;
- public int dwForwardMetric5;
-
- public static implicit operator MIB_IPFORWARDROW(RouteEntry value)
- {
- var mibIpforwardrow = new MIB_IPFORWARDROW();
- mibIpforwardrow.dwForwardAge = value.Age;
- mibIpforwardrow.dwForwardDest = BitConverter.ToUInt32(value.Destination.GetAddressBytes(), 0);
- mibIpforwardrow.dwForwardMask = BitConverter.ToUInt32(value.Mask.GetAddressBytes(), 0);
- mibIpforwardrow.dwForwardMetric1 = value.Metric1;
- mibIpforwardrow.dwForwardMetric2 = value.Metric2;
- mibIpforwardrow.dwForwardMetric3 = value.Metric3;
- mibIpforwardrow.dwForwardMetric4 = value.Metric4;
- mibIpforwardrow.dwForwardMetric5 = value.Metric5;
- mibIpforwardrow.dwForwardNextHop = BitConverter.ToUInt32(value.NextHop.GetAddressBytes(), 0);
- mibIpforwardrow.dwForwardNextHopAS = value.NextHopAS;
- mibIpforwardrow.dwForwardPolicy = value.Policy;
- mibIpforwardrow.dwForwardProto = value.Protocol;
- mibIpforwardrow.dwForwardType = value.ForwardType;
- var adaptersTable = new AdaptersTable();
- mibIpforwardrow.dwForwardIfIndex = adaptersTable.GetAdapterIndex(value.RelatedInterface);
- return mibIpforwardrow;
- }
- }
-
- [DllImport("iphlpapi", SetLastError = true)]
- public static extern int GetIfTable(IntPtr pIfTable, ref int pdwSize, bool bOrder);
-
- [DllImport("iphlpapi", SetLastError = true)]
- public static extern int GetIfEntry(ref MIB_IFROW pIfRow);
-
- [DllImport("iphlpapi", SetLastError = true)]
- public static extern int GetBestRoute(uint dwDestAddr, int dwSourceAddr, out MIB_IPFORWARDROW pRoute);
-
[DllImport("User32", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();
-
- [DllImport("WinINet")]
- public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
}
}