我发现了用于管理IP相关信息的IP Helper接口,但我没有找到一种方法来获取和/或更改给定适配器的网关地址, Windows XP。有任何想法吗?获取和设置支持Windows XP的C默认网关
回答
如果您可以使用WMI,则有Win32_NetworkAdapterConfiguration类。如果您需要普通的旧C API,我发现this(“设置默认网关地址”靠近底部)。
GetAdaptersInfo()
和GetAdaptersAddresses()
函数都返回每个适配器的网关信息。
它们会在您编译为vista或更高版本时执行。 – chacham15 2011-03-07 09:07:21
'GetAdaptersInfo()'在XP SP3上为我返回网关信息。 – 2011-03-08 08:26:05
注意:Win32_NetworkAdapterConfiguration :: SetGateways()将设置网关指定的参数,其中存在网关将被覆盖。
但是:删除似乎没有使用SetGateways()WMI呼叫时工作网关(S) - 在我的情况下,调用返回成功,但网关仍然存在。似乎有很多人看到了这一点(在StringArray中设置NULL字符串或为StringArray传递NULL都没有帮助)。
在我的情况下,我开始使用WMI方式(很可能是因为EnableDHCP()),还需要实现Luke建议的WINAPI方式,以便通过网关消除灾难。非常感谢卢克!上述
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,
CISCO = 11,
BBN = 12,
OSPF = 13,
BGP = 14,
NT_AUTOSTATIC = 10002,
NT_STATIC = 10006,
NT_STATIC_NON_DOD = 10007
}
[StructLayout(LayoutKind.Sequential)]
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 List<MIB_IPFORWARDROW> FromByteArray(byte[] buffer)
{
List<MIB_IPFORWARDROW> ret = new List<MIB_IPFORWARDROW>();
int n =
(buffer[3] << 24) +
(buffer[2] << 16) +
(buffer[1] << 8) +
(buffer[0] << 0);
int offset = sizeof(int);
for (int i = 0; i < n; i++)
{
MIB_IPFORWARDROW map = new MIB_IPFORWARDROW();
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(map));
Marshal.StructureToPtr(map, ptr, false);
Marshal.Copy(buffer, offset, ptr, Marshal.SizeOf(map));
map = (MIB_IPFORWARDROW)Marshal.PtrToStructure(ptr, typeof(MIB_IPFORWARDROW));
Marshal.FreeHGlobal(ptr);
ret.Add(map);
offset += Marshal.SizeOf(map);
}
return ret;
}
}
[DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]
public static extern int GetIpForwardTable(byte[] pIpForwardTable, ref ulong pdwSize, bool bOrder);
[DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]
public static extern int DeleteIpForwardEntry(ref MIB_IPFORWARDROW pRoute);
[DllImport("Iphlpapi.dll", CharSet = CharSet.Auto)]
public static extern int SetIpForwardEntry(ref MIB_IPFORWARDROW pRoute);
private static uint IPToUIntR(IPAddress ip)
{
uint ret = 0;
byte[] ipBytes = ip.GetAddressBytes();
ret += (uint)ipBytes[0] << 24;
ret += (uint)ipBytes[1] << 16;
ret += (uint)ipBytes[2] << 8;
ret += (uint)ipBytes[3];
return ret;
}
public static List<MIB_IPFORWARDROW> GetIPForwardTable(int index)
{
List<MIB_IPFORWARDROW> ret = new List<MIB_IPFORWARDROW>();
ulong size = 0;
int err = GetIpForwardTable(null, ref size, false);
byte[] buffer = new byte[size];
err = GetIpForwardTable(buffer, ref size, false);
if (err != 0)
{
throw new System.ComponentModel.Win32Exception(err, $"GetIPForwardTable return with error code {err}");
}
foreach (MIB_IPFORWARDROW mipr in MIB_IPFORWARDROW.FromByteArray(buffer))
{
if (mipr.dwForwardIfIndex != index)
{
continue;
}
ret.Add(mipr);
}
return ret;
}
public static void SetDefaultGateway(int index, string gateway)
{
int err;
int i;
List<MIB_IPFORWARDROW> l = GetIPForwardTable(index);
MIB_IPFORWARDROW mipr = new MIB_IPFORWARDROW();
for (i = 0; i < l.Count; ++i)
{
// 0.0.0.0 default gateway
if (l[i].dwForwardDest != 0)
{
continue;
}
mipr = l[i];
err = DeleteIpForwardEntry(ref mipr);
if (err != 0)
{
throw new System.ComponentModel.Win32Exception(err, $"DeleteIpForwardEntry return with error code {err}");
}
break;
}
mipr.dwForwardNextHop = IPToUIntR(IPAddress.Parse(gateway));
err = SetIpForwardEntry(ref mipr);
if (err != 0)
{
throw new System.ComponentModel.Win32Exception(err, $"DeleteIpForwardEntry return with error code {err}");
}
}
代码使用pinvokes使用iphelper功能在.NET中,所以,忘掉pinvokes和使用代码为您的Win32应用程序的参考。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366363(v=vs.85).aspx
编辑: 您可以使用下面的代码,以获得适配器信息。并在需要使用SetDefaultGateway时使用Index字段。
const int MAX_ADAPTER_ADDRESS_LENGTH = 8;
const int MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
const int MAX_ADAPTER_NAME_LENGTH = 256;
const int MAX_ADAPTER_NAME = 128;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct IP_ADDRESS_STRING
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string Address;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct IP_ADDR_STRING
{
public IntPtr Next;
public IP_ADDRESS_STRING IpAddress;
public IP_ADDRESS_STRING IpMask;
public ulong Context;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct IP_ADAPTER_INFO
{
public IntPtr Next;
public Int32 ComboIndex;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ADAPTER_NAME_LENGTH + 4)]
public string AdapterName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_ADAPTER_DESCRIPTION_LENGTH + 4)]
public string AdapterDescription;
public UInt32 AddressLength;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_ADAPTER_ADDRESS_LENGTH)]
public byte[] Address;
public Int32 Index;
public UInt32 Type;
public UInt32 DhcpEnabled;
public IntPtr CurrentIpAddress;
public IP_ADDR_STRING IpAddressList;
public IP_ADDR_STRING GatewayList;
public IP_ADDR_STRING DhcpServer;
public bool HaveWins;
public IP_ADDR_STRING PrimaryWinsServer;
public IP_ADDR_STRING SecondaryWinsServer;
public Int32 LeaseObtained;
public Int32 LeaseExpires;
}
[DllImport("iphlpapi.dll", CharSet = CharSet.Ansi)]
static extern int GetAdaptersInfo(byte[] pAdapterInfo, ref ulong pBufOutLen);
public static List<IP_ADAPTER_INFO> GetAllAdapters()
{
List<IP_ADAPTER_INFO> ret = new List<IP_ADAPTER_INFO>();
ulong size = 0;
int err = GetAdaptersInfo(null, ref size);
byte[] buffer = new byte[size];
err = GetAdaptersInfo(buffer, ref size);
if (err != 0)
{
throw new System.ComponentModel.Win32Exception(err, $"GetInterfaceInfo return with error code {err}");
}
GCHandle gc = GCHandle.Alloc(buffer, GCHandleType.Pinned);
IntPtr pEntry = gc.AddrOfPinnedObject();
do
{
IP_ADAPTER_INFO entry = (IP_ADAPTER_INFO)Marshal.PtrToStructure(pEntry, typeof(IP_ADAPTER_INFO));
ret.Add(entry);
pEntry = entry.Next;
}
while (pEntry != IntPtr.Zero);
gc.Free();
return ret;
}
尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/17580508) – 2017-10-10 09:34:20
- 1. Linux中C上的默认网关
- 2. Windows XP默认路由
- 3. 如何在Windows XP中更改系统默认区域设置?
- 4. 从默认网关获取mac地址?
- 5. 在java中获取默认网关
- 6. 为什么Firefox和其他应用不支持我的Windows XP设置?
- 7. 获取所有从默认设置
- 8. 获取当前默认maxConcurrentSessions设置
- 9. 对远程NDIS的Windows XP支持
- 10. 铿锵支持Windows xp的例外
- 11. PacketTrace默认网关
- 12. 默认设置visual C#
- 13. Visual C++ 2010默认设置
- 14. 设置默认“ok”和“取消”按钮
- 15. 支持DPI和默认字体更改
- 16. Android:默认支持Gzip/Http?
- 17. @property获取器和设置器的默认实现列表
- 18. 禁用蓝牙支持在Windows XP-7
- 19. stripe firebase函数设置默认支付
- 20. Windows XP此操作系统不支持指定的区域设置。 [LCID = 16393]
- 21. .Net和默认设置
- 22. 将开发分支设置为拉取请求的默认值
- 23. git - 如何获取默认分支?
- 24. C#:定义类变量,默认值和获取设置不工作?
- 25. C# - 如何设置Windows窗体的默认属性?
- 26. 如何获取我使用C#连接的路由器的默认网关?
- 27. C#中的默认设置参数#
- 28. Objective-C设置属性的默认值
- 29. 获取默认的Windows系统图标的最小化,最大化和关闭
- 30. 使用VB.Net获取IP地址,子网,默认网关,DNS1和DNS2
对不起,我的错误。这些功能还需要Windows Vista。 – chacham15 2011-03-07 09:21:41
只需从函数和结构名称中删除2;例如GetIpForwardTable(),DeleteIpForwardEntry()等等。这些函数和结构返回到Windows 2000. – Luke 2011-03-07 12:37:48