Как программно создавать статические записи кэша ARP в Windows XP

Есть ли способ установить запись кеша ARP в С#?

Единственный способ, который я нашел, связан с использованием утилиты arp Протокол разрешения адресов

Статические записи, добавленные с помощью команды arp -s, не удаляются из кэша.

Есть связанный пост о Как мне получить доступ к информации ARP-протокола через .NET?


person volody    schedule 08.10.2010    source источник


Ответы (4)


Очевидно, что это не будет чисто .NET, но вы сможете сделать это через Win32 API в библиотеке IP Helper API, а именно через методы CreateIpNetEntry и SetIpNetEntry. Скорее всего, вы захотите сделать это с помощью P/Invoke или упакованной управляемой библиотеки C++.

http://msdn.microsoft.com/en-us/library/aa366071(v=vs.85).aspx

person Zach Burlingame    schedule 20.01.2011

Простое решение, которое я сейчас использую, — запустить пакетную команду, которая добавит эту статическую запись в таблицу 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
person volody    schedule 23.12.2010

Вы можете просто запустить команду 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();
person Orestis P.    schedule 20.09.2013

Попробуй это. (спасибо Заку) Обязательно защитите чувствительные части с помощью 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;
    }
}
person Iulian M.    schedule 10.12.2020