Is there are way to set ARP cache entry in C#?
The only way I have found is related to use of arp utility Address Resolution Protocol
Static entries added with the arp -s command are not expired from the cache.
There are related post about How do I access ARP-protocol information through .NET?
It wouldn't be purely .NET obviously, but you should be able to do it via the Win32 API in the IP Helper API library - namely the CreateIpNetEntry and SetIpNetEntry methods. You would likely want to do this via P/Invoke or a wrapped managed C++ library.
http://msdn.microsoft.com/en-us/library/aa366071(v=vs.85).aspx
The simple solution I am using right now is to run batch command that will add this static entry into ARP table. On Vista and up this will require administrator user rights.
' 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
You can simply run the command ARP -s inet_addr eth_adr where inet_addr is the IP address and eth_adr is the hardware address.
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();