arp-пинговалка и SendARP
От: WhiteDove  
Дата: 12.01.12 09:49
Оценка:
Задача — установить, в онлайне ли комп.
Несмотря на блокировку всякими advfirewall'ами icmp.

Написал код:

        private ArrayList ArpSomeIPs(ArrayList aListOfIPs)
        {
            ArrayList tempRes = new ArrayList();
            foreach (string IP in aListOfIPs)
            {
                IPAddress dst = IPAddress.Parse(IP); 

                byte[] macAddr = new byte[6];
                for (int i = 0; i < 6; i++)
                    macAddr[i] = 0;
                uint macAddrLen = (uint)macAddr.Length;
                try
                {
                    if (SendARP((int)dst.Address, 0, macAddr, ref macAddrLen) != 0)
                        throw new InvalidOperationException("SendARP failed.");

                    string[] str = new string[(int)macAddrLen];
                    for (int i = 0; i < macAddrLen; i++)
                        str[i] = macAddr[i].ToString("x2");

                    //Console.WriteLine();
                    tempRes.Add(string.Join(":", str)); //распознали мак - значит, комп включен.
                }
                catch
                {
                    tempRes.Add(false.ToString());
                }
            }
            return tempRes;
        }

В принципе работает, и хорошо работает.
Вопросы по подводным камням тем, кто работал с SendARP, вопросы:
1. Кэширование
1.1. Использование локальной ARP-таблицы. MSDN:
If the information requested is not in the ARP table on the local computer, then the SendARP function will cause an ARP request to be sent to obtain the physical address
Почему тогда сразу после выключения компа (10 секунд, таймаут ARP-таблицы 2 минуты) процедура пишет fail? Кто обновил ARP-таблицу? Как работать напрямую с сетью, минуя ARP-таблицу?
1.2. Имеются ли другие кэши на уровне ARP-протокола? Есть ли кэши на каком-нибудь сервере? Как обновляются, если есть?
2. Один IP, много маков. Что следует ожидать и проверять?
Re: arp-пинговалка и SendARP
От: WhiteDove  
Дата: 12.01.12 12:56
Оценка:
Также интересует вопрос регулирования таймаута этого дела, т.к. согласно теч-архиву
http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.networks/2006-08/msg00387.html

I am using C++ and my first attempt was to use SendArp() for each IP, but it takes 255 seconds since each SendARP() returns after waiting 1 second.
Re[2]: arp-пинговалка и SendARP
От: ononim  
Дата: 12.01.12 16:13
Оценка:
я в свое время тупо сделал ARP-пилку на winpcap
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.