Пинговалка arp - пакетами на VB.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Пинговалка arp - пакетами на VB.

Сообщение VAC » 09.03.2005 (Ср) 13:53

Господа!

Сталкивался ли кто с этим?
Если в сети около 2500 компьютеров, учитывая, что многие используют файрволы, процесс "пингования" будет очень медленным, мало того, от многих с файерволом ICMP пакеты приходить не будут.
Думается мне, что многие захотели б иметь пример того, как пинговать компьютеры в сети, даже если люди этого не хотят.. +)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.03.2005 (Ср) 14:38

PING-служба есть только в ICMP. Так что вопроса я не понял.
Lasciate ogni speranza, voi ch'entrate.

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 09.03.2005 (Ср) 15:18

Так я и говорю о том, что бы избавиться от ICMP.
ARP пакет отфильтровать нельзя, потому как функционирование сети без него - невозможно, соответственно, если отсылать такой запрос на определенный IP клиент все равно на него ответит, если он включен и имеется связь.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.03.2005 (Ср) 15:20

Какой запрос? В arp-протоколе нет запроса PING.
Lasciate ogni speranza, voi ch'entrate.

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 09.03.2005 (Ср) 15:53

<Вырезка>
Каждый сетевой адаптер принимает широковещательные передачи. Все драйверы Ethernet проверяют поле типа в принятом Ethernet-кадре и передают ARP-пакеты модулю ARP. ARP-запрос можно интерпретировать так: "Если ваш IP-адрес совпадает с указанным, то сообщите мне ваш Ethernet-адрес". Пакет ARP-запроса выглядит примерно так:


IP-адрес отправителя: 223.1.2.1
Ethernet-адрес отправителя: 08:00:39:00:2F:C3
Искомый IP-адрес: 223.1.2.2
Искомый Ethernet-адрес: <пусто>

Каждый модуль ARP проверяет поле искомого IP-адреса в полученном ARP-пакете и, если адрес совпадает с его собственным IP-адресом, то посылает ответ прямо по Ethernet-адресу отправителя запроса. ARP-ответ можно интерпретировать так: "Да, это мой IP-адрес, ему соответствует такой-то Ethernet-адрес". Пакет с ARP-ответом выглядит примерно так:


IP-адрес отправителя: 223.1.2.2
Ethernet-адрес отправителя: 08:00:28:00:38:A9
Искомый IP-адрес: 223.1.2.1
Искомый Ethernet-адрес: 08:00:39:00:2F:C3

Этот ответ получает машина, сделавшая ARP-запрос. Драйвер этой машины проверяет поле типа в Ethernet-кадре и передает ARP-пакет модулю ARP. Модуль ARP анализирует ARP-пакет и добавляет запись в свою ARP-таблицу.
</Вырезка>

Если мы получили - Искомый Ethernet-адрес: <пусто> - Значит такого IP адреса нет.
Если мы получили - Искомый Ethernet-адрес: 08:00:39:00:2F:C3 - Значит такое IP адрес есть.

"PING" имелось ввиду образно =))) - не нужно собирать пакеты разной длины и проверять патери при передаче, не нужно время отклика. Нужно только - есть такой IP сейчас, или его нет.
Смысл думаю теперь понятен...

Дружбан как то по моей просьбе мне писал такое на Delphi, но я по не осторожности утерял исходник, теперь опять пригодилось...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.03.2005 (Ср) 15:57

Видимо дружбан использовал ассемблерные вставки. Это надо работать напрямую с NIC, фиг его знает, как это в VB делать. Winsock тут не при делах, потому что нужно на два уровня ниже.
Lasciate ogni speranza, voi ch'entrate.

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 09.03.2005 (Ср) 16:23

Ассемблера небыло точно! =)

Делалось на API... а жаль, придется судя по всему ещё раз просить.. =)

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 09.03.2005 (Ср) 17:32

Детально проштудировав форум, понял, что вопрос сей "а как получить мак адрес другого компьютера в сети?" задавался не раз, но ответов я не нашёл.

Хотя странно, потому как полезно было б многим...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.03.2005 (Ср) 22:04

2VAC: если я правильно понимаю, то область действия такого "трюка" ограничена одной локалкой - в отличие от ICMP. Т.е. это ни в коем случае ему не "замена".
Изображение

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 09.03.2005 (Ср) 22:47

Абсолютно точно!

Как то понадобилось написать сетевой поисковый сервер, который шарится по всем компам в сети и сливает на SQL сервер все, что найдет в шарингах пользователей с содержимым расшареным для всех.

Система уже работает год-полтора, но некая мода - ставить фаерволы с блокированием ICMP пакетов несколько ухудшила ситуацию, потому как мой поисковик прежде чем лезть на комп из списка WNetEnumResource пингует его.
Собстна хочется просто увидеть работает ли комп сейчас посредством arp запроса.
Как я говорил у меня была "пинговалка", которая могла получить список работающих компов и записать все это дело в базу, но этот исходник я потерял...

Весч эта не замена ICMP, но пригодится может многим.. =)
Например, если не учитывать пакости, которые можно сотворить с данным протоколом пригождалась она, когда, какой то умник пытался подменив IP и мак напакостить. Если рассылать arp пакет "ответ" с указанием IP и мака восстанавливает таблицы на свитчах.. и такой умник обламывается.

Есть ещё мысли господа? =)

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 09.03.2005 (Ср) 23:06

Если кому интересно, нашел исходники для Delphi где это все есть.:
ftp://delphi-jedi.org/api/IPHlpAPI.zip
Жаль только, что я в Delphi нихтферштейн =((

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 09.03.2005 (Ср) 23:28

Может это именно то? =)
Кто сможет перевести на VB?

//
// Link with ws2_32.lib and iphlpapi.lib
//

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iphlpapi.h>


int __cdecl main()
{
HRESULT hr;
IPAddr ipAddr;
ULONG pulMac[2];
ULONG ulLen;

ipAddr = inet_addr ("216.145.25.31");
memset (pulMac, 0xff, sizeof (pulMac));
ulLen = 6;

hr = SendARP (ipAddr, 0, pulMac, &ulLen);
printf ("Return %08x, length %8d\n", hr, ulLen);

size_t i, j;
char * szMac = new char[ulLen*3];
PBYTE pbHexMac = (PBYTE) pulMac;

//
// Convert the binary MAC address into human-readable
//
for (i = 0, j = 0; i < ulLen - 1; ++i) {
j += sprintf (szMac + j, "%02X:", pbHexMac[i]);
}

sprintf (szMac + j, "%02X", pbHexMac[i]);
printf ("MAC address %s\n", szMac);

delete [] szMac;

return 0;
}

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 09.03.2005 (Ср) 23:30

Что-то этот Дельфи очень С++ напоминает...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.03.2005 (Чт) 2:27

Ага...
Хм...

Во-первых, приведённый код является цитатой из MSDN :)
Во-вторых, функция SendARP есть на виндах 2k+.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 10.03.2005 (Чт) 12:22

Действительно приведенный код не из того зипа, в котором исходники на Дельфях, а "цитата" из писания MSDN.

Есть такая функция:
Код: Выделить всё
Private Declare Function SendARP Lib "IPHLPAPI.dll" ( _
    ByRef DestIP As IPAddr, _
    ByRef SrcIP As IPAddr, _
    ByRef pMacAddr As Long, _
    ByRef PhyAddrLen As Long) As Long

И все в ней понятно кроме этой структуры: IPAddr
В MSDN нашел вот что:
Код: Выделить всё
typedef struct { 
   union {   
   struct {     
      u_char s_b1,s_b2,s_b3,s_b4;
   } S_un_b;
   struct {
      u_short s_w1,s_w2;
   } S_un_w;
   u_long S_addr;
   } S_un;
} IPAddr;

Members
S_un
   S_un_b
   Address of the host formatted as four u_chars.
   S_un_w
   Address of the host formatted as two u_shorts.
   S_addr
   Address of the host formatted as a u_long.

Но как это перевести на VB? И как на VB преобразовать IP адрес в то, что требуется для IPAddr?

И как получить текущий МАК на локальной машине, как написано тут:
Код: Выделить всё
memset (pulMac, 0xff, sizeof (pulMac));
??

Вообщем ГУРУ вы или ГДЕ господа?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.03.2005 (Чт) 12:58

Мы-то тут, но что за шум ради функции, которой нет на моей Win98? :)

Структуру IPAddr перевести очень просто:
Код: Выделить всё
private type IPAddr
  s_b1 as byte
  s_b2 as byte
  s_b3 as byte
  s_b4 as byte
end type


А вот это вот -
Код: Выделить всё
memset (pulMac, 0xff, sizeof (pulMac));
- всего лишь заполнение этой структуры байтами &HFF :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.03.2005 (Чт) 13:02

Думаю, проще использовать Long.
Lasciate ogni speranza, voi ch'entrate.

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 10.03.2005 (Чт) 14:12

Структуру IPAddr перевести очень просто:
Visual Basic:
private type IPAddr
s_b1 as byte
s_b2 as byte
s_b3 as byte
s_b4 as byte
end type


Я не совсем догоняю тоесть здесь конвертитсяип адресок в байты ? По подробнее можно ?

:wink:
Max!

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 10.03.2005 (Чт) 14:32

Код: Выделить всё
Private Type IPAddr
  s_b1 As Byte
  s_b2 As Byte
  s_b3 As Byte
  s_b4 As Byte
End Type
Private Declare Function SendARP Lib "IPHLPAPI.dll" ( _
        ByRef DestIP As IPAddr, _
        ByRef SrcIP As IPAddr, _
        ByRef pMacAddr As Long, _
        ByRef PhyAddrLen As Long) As Long

Private Sub Command1_Click()
Dim Ip1 As IPAddr
Dim Ip2 As IPAddr
Dim Mac As Long
Dim AdrLen As Long
'myip 10.10.40.18
'targetip 10.10.110.8
AdrLen = 255
Ip1.s_b1 = CByte(10)
Ip1.s_b2 = CByte(10)
Ip1.s_b3 = CByte(40)
Ip1.s_b4 = CByte(18)

Ip2.s_b1 = CByte(10)
Ip2.s_b2 = CByte(10)
Ip2.s_b3 = CByte(110)
Ip2.s_b4 = CByte(8)
Err.Clear

s = SendARP(Ip2, Ip1, Mac, AdrLen)

MsgBox Mac & vbCrLf & AdrLen & vbCrLf & s & vbCrLf & Err.LastDllError
End Sub


хмм.. Функция возвращает s = 31
Как бы посмотреть что значат эти цифры?

re: Мы-то тут, но что за шум ради функции, которой нет на моей Win98?
Ну млин =))) - понимаю, что надоели тут плотно, собстна сорри =))

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.03.2005 (Чт) 15:53

VAC писал(а):
Код: Выделить всё
Private Type IPAddr
  s_b1 As Byte
  s_b2 As Byte
  s_b3 As Byte
  s_b4 As Byte
End Type
Private Declare Function SendARP Lib "IPHLPAPI.dll" ( _
        ByRef DestIP As IPAddr, _
        ByRef SrcIP As IPAddr, _
        ByRef pMacAddr As Long, _
        ByRef PhyAddrLen As Long) As Long

Private Sub Command1_Click()
Dim Ip1 As IPAddr
Dim Ip2 As IPAddr
Dim Mac As Long
Dim AdrLen As Long
'myip 10.10.40.18
'targetip 10.10.110.8
AdrLen = 255
Ip1.s_b1 = CByte(10)
Ip1.s_b2 = CByte(10)
Ip1.s_b3 = CByte(40)
Ip1.s_b4 = CByte(18)

Ip2.s_b1 = CByte(10)
Ip2.s_b2 = CByte(10)
Ip2.s_b3 = CByte(110)
Ip2.s_b4 = CByte(8)
Err.Clear

s = SendARP(Ip2, Ip1, Mac, AdrLen)

MsgBox Mac & vbCrLf & AdrLen & vbCrLf & s & vbCrLf & Err.LastDllError
End Sub




Уважаемая администрация и Гайдар лично!
Бандит показал мне вышеотквоченное так:

Visual Basic:

Private Type IPAddr <br /> s_b1 As Byte <br /> s_b2 As Byte <br /> s_b3 As Byte <br /> s_b4 As Byte <br /> End Type <br /> Private Declare Function SendARP Lib "IPHLPAPI.dll" ( _ <br /> ByRef DestIP As IPAddr, _ <br /> ByRef SrcIP As IPAddr, _ <br /> ByRef pMacAddr As Long, _ <br /> ByRef PhyAddrLen As Long) As Long <br /> <br /> Private Sub Command1_Click() <br /> Dim Ip1 As IPAddr <br /> Dim Ip2 As IPAddr <br /> Dim Mac As Long <br /> Dim AdrLen As Long <br /> 'myip 10.10.40.18 <br /> 'targetip 10.10.110.8 <br /> AdrLen = 255 <br /> Ip1.s_b1 = CByte(10) <br /> Ip1.s_b2 = CByte(10) <br /> Ip1.s_b3 = CByte(40) <br /> Ip1.s_b4 = CByte(18) <br /> <br /> Ip2.s_b1 = CByte(10) <br /> Ip2.s_b2 = CByte(10) <br /> Ip2.s_b3 = CByte(110) <br /> Ip2.s_b4 = CByte(8) <br /> Err.Clear <br /> <br /> s = SendARP(Ip2, Ip1, Mac, AdrLen) <br /> <br /> MsgBox Mac & vbCrLf & AdrLen & vbCrLf & s & vbCrLf & Err.LastDllError <br /> End Sub

Сделайте назад, как было, - было правильно.
Изображение

VAC
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 03.03.2002 (Вс) 3:32
Откуда: Russia

Сообщение VAC » 10.03.2005 (Чт) 17:55

А вот почему?

Код: Выделить всё
s = SendARP(Ip2, Ip1, Mac, AdrLen)

sMsgBuf = Space(256)
dwLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, _
     s, LANG_USER_DEFAULT, _
     ByVal sMsgBuf, 256, ByVal 0&)


Почему результат: sMsgBuf = Space(256)
Хотя функция возвращает s = 31
??
Подставлял разные значения:
Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
Const FORMAT_MESSAGE_ARGUMENT_ARRAY = &H2000
Const FORMAT_MESSAGE_FROM_HMODULE = &H800
Const FORMAT_MESSAGE_FROM_STRING = &H400
Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Const FORMAT_MESSAGE_MAX_WIDTH_MASK = &HFF

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.03.2005 (Чт) 18:52

31 означает Присоединенное к системе устройство не работает.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 11.03.2005 (Пт) 12:37

Все это конечно интересно, но есть одно но-
2500 компьютеров в одной подсети не вмещаюся, а широковещательные пакеты дальше ближаешего роутера не пройдут :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.03.2005 (Пт) 12:59

Причем тут ARP и широковещательные запросы?
Lasciate ogni speranza, voi ch'entrate.

Inferno
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 26.01.2005 (Ср) 1:06

Сообщение Inferno » 11.03.2005 (Пт) 13:25

APR- протокол преобразования IP адресов в МАК адреса.
Если компьютер еще не засветился в арп таблице, то его мак адрес определяется путем посылки широковещательного запроса с вложенным в него ип адресом. Этот запрос адресован всем компьютерам в локальной сети, но отвечает на него только тот который имеет этот ип.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.03.2005 (Пт) 20:31

Inferno писал(а):Все это конечно интересно, но есть одно но-
2500 компьютеров в одной подсети не вмещаюся

А это, интересно, почему? :-)
В одной подсети, насколько нас учили, м.б. до 2^24 компов.
Изображение

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 12.03.2005 (Сб) 0:21

Подсеть вида ХХХ.ХХХ.ХХХ.1-255 ?
Где там 2^24 ? :roll:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.03.2005 (Пн) 9:23

А кто говорил о подсети класса C? Подсеть класса A (10.*.*.*) вмещает именно 2^24-2 устройств.
Lasciate ogni speranza, voi ch'entrate.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53

    TopList