是否有办法在C#中设置ARP缓存条目?
我找到的唯一方法是使用 arp 实用程序Address Resolution Protocol
的相关帖子使用 arp -s 命令添加的静态条目未从缓存中过期。
答案 0 :(得分:0)
我现在使用的简单解决方案是运行批处理命令,将此静态条目添加到ARP表中。在Vista及以上版本中,这将需要管理员用户权限。
' arp -s 192.168.1.12 01-02-03-04-05-06
Public Sub UpdateArpTable(IpAddress as string, MacAddress as string)
Dim outputMessage As string = ""
Dim errorMessage As string = ""
Dim command As String = String.Format("-s {0} {1}", Address, MacAddress)
ExecuteShellCommand("arp", command, outputMessage, errorMessage)
End Sub
Public Shared Sub ExecuteShellCommand(FileToExecute As String, CommandLine As String)
Dim Process As System.Diagnostics.Process = Nothing
Try
Process = New System.Diagnostics.Process()
Dim CMDProcess As String = String.Format("{0}\cmd.exe", Environment.SystemDirectory)
Dim Arguments As String = String.Format("/C {0}", FileToExecute)
If CommandLine IsNot Nothing AndAlso CommandLine.Length > 0 Then
Arguments += String.Format(" {0}", CommandLine)
End If
Dim ProcessStartInfo As New System.Diagnostics.ProcessStartInfo(CMDProcess, Arguments)
ProcessStartInfo.CreateNoWindow = True
ProcessStartInfo.UseShellExecute = False
ProcessStartInfo.RedirectStandardOutput = True
ProcessStartInfo.RedirectStandardInput = True
ProcessStartInfo.RedirectStandardError = True
Process.StartInfo = ProcessStartInfo
Process.Start()
Process.WaitForExit()
Process.WaitForExit()
Finally
' close process and do cleanup
Process.Close()
Process.Dispose()
Process = Nothing
End Try
End Sub
答案 1 :(得分:0)
显然不是纯粹的.NET,但您应该能够通过IP Helper API库中的Win32 API(即CreateIpNetEntry和SetIpNetEntry方法)来实现。您可能希望通过P / Invoke或包装的托管C ++库来执行此操作。
http://msdn.microsoft.com/en-us/library/aa366071(v=vs.85).aspx
答案 2 :(得分:0)
您只需运行命令ARP -s inet_addr eth_adr,其中inet_addr是IP地址,eth_adr是硬件地址。
Process process = new Process();
process.StartInfo.FileName = "arp -s 220.0.0.161 00-50-04-62-F7-23";
process.StartInfo.CreateNoWindow = true; //Don't show window
process.Start();
答案 3 :(得分:0)
尝试这个。 (归功于Zach) 确保通过try / catch保护敏感部分
using System;
using System.Net;
using System.Runtime.InteropServices;
namespace CreateArpEntry
{
class Program
{
[DllImport("iphlpapi.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.U4)]
public static extern int CreateIpNetEntry(ref MIB_IPNETROW tableEntry);
static void Main(string[] args)
{
IPAddress.TryParse("192.168.1.2", out IPAddress parsedIpAddress);
byte[] macBytes = {0,0x0b,0x3b,0,0,1,0,0}; // pad the MAC address with zeros
MIB_IPNETROW arpEntry = new MIB_IPNETROW
{
Index = 20,
Addr = BitConverter.ToInt32(parsedIpAddress.GetAddressBytes(), 0),
PhysAddr = macBytes,
PhysAddrLen = 8,
Type = 4, // it can only be static
};
int a = CreateIpNetEntry(ref arpEntry);
}
}
[StructLayout(LayoutKind.Sequential)]
public struct MIB_IPNETROW
{
/// <summary>
/// The index of the adapter (Not constant may change for example by disable / enable
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public int Index;
/// <summary>
/// The length of the physical address ( MAC Address)
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public int PhysAddrLen;
/// <summary>
/// The physical / MAC Address
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] PhysAddr;
/// <summary>
/// The IP Address
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public int Addr;
/// <summary>
/// The IP Address Type
/// Other = 1, Invalid = 2, Dynamic = 3, Static = 4
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public int Type;
}
}