Strona 1 z 1
Szybkie wykrywanie IP w sieci lokalnej
Napisane:
środa, 8 czerwca 2016, 13:08
przez Yari27
Potrzebuję zrobić szybkie wykrywanie IP dostępnych w sieci. pingowanie po kolei wszystkich adresów dostępnych w danej sieci odpada, trwa zbyt długo nawet w przypadku tylko 4 oktetu, próbowałem pingować w 4 wątkach naraz - skraca to czas sprawdzania sieci (ale niewiele), jednak dla 3 i 4 oktetu trwa już kilkadziesiąt minut - to strasznie długo.
Próbowałem z wysyłaniem danych na adres broadcast, jednak w mojej sieci na pinga na 192,168.1.255 nie odpowiada żaden komputer. Nie wiem, czy to specyfika tylko mojej sieci, czy może tak się po prostu nie da?
Można np. wysłać ping rozgłoszeniowo i później tylko czekać na odpowiedźi?
A może jakiś inny komponent indy oferuje takie możliwości?
Dobrym i szybkim rozwiązaniem było by łączenie i rozłączanie się z każdym IP?
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
środa, 8 czerwca 2016, 22:55
przez Cyfrowy Baron
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
WSAStartup(wVersionRequested, &wsaData);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
WSACleanup();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
hostent *p;
char s[128];
char *p2;
//Pobierz nazwę komputera i adres
gethostname(s, 128);
p = gethostbyname(s);
p2 = inet_ntoa(*((in_addr *)p->h_addr));
ListBox1->Items->Add((AnsiString)p->h_name + " " + (AnsiString)p2);
}
//---------------------------------------------------------------------------
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
czwartek, 9 czerwca 2016, 10:41
przez Yari27
Nie rozumiem w jaki sposób miałbym wykorzystać tek kod, przecież on pobiera tylko nazwę komputera hosta i jego adres tylko z jednej karty sieciowej.
Jak tutaj zrobić pętle dla reszty urządzeń?
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
czwartek, 9 czerwca 2016, 20:14
przez polymorphism
A jak pingujesz?
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
piątek, 10 czerwca 2016, 12:27
przez Yari27
for (unsigned char l = 0; l < 65; l++) {
ICMP2->Host = Edit1->Text+String(l);
try {
ICMP2->Ping();
} catch (...) {;}
}
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
piątek, 10 czerwca 2016, 14:20
przez polymorphism
OK. W prawdzie nie znam tej biblioteki, której używasz, ale poszukaj, czy nie masz tam jakiejś metody, która ustawia czas oczekiwania na odpowiedź - to powinno znacznie skrócić czas skanowania.
Z tego co czytałem w internetach, pingowanie adresu rozgłoszeniowego raczej nie będzie działać, więc pozostaje Ci skanowanie kolejnych adresów IP.
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
piątek, 10 czerwca 2016, 15:39
przez Yari27
Używam komponentu INDY
IdIcmpClient1
ReceiveTimeout mam ustawione na 30ms
Przestawiłem na 1ms - tak samo, na 300ms dalej tak samo
Wydaje mi się że wysyła tak długo a nie odbiera, chociaż PacketSize mam na 15.
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
piątek, 10 czerwca 2016, 19:06
przez polymorphism
Raczej wąskim gardłem są adresy nieaktywne (w każdym razie wnioskuje po zachowaniu komendy ping). Możesz spróbować inne kody pingujące, ale podejrzewam, że czas skanowania będzie podobny.
Do czego Ci to?
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
sobota, 11 czerwca 2016, 15:27
przez Yari27
Chciałem zrobić prosty skaner urządzeń w sieci. Wiem jak podłączane urządzenia będą się mniej więcej nazywać ale nie wiem jaki będą miały adres IP więc myślałem przeskanować chociaż 4 oktet (najlepiej dwa ostatnie) i dla tych które odpowiedzą sprawdzić nazwę hosta.
A da się wysłać przez broadcast żądanie odpowiedzi?
Albo jak użyć albo podglądnąć zapytania
ARP ?
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
sobota, 11 czerwca 2016, 15:55
przez Cyfrowy Baron
Mając nazwy wszystkich hostów w sieci, można by odczytać ich adresy IP. Wiem jak pobrać wszystkie zasoby sieciowe, ale nie potrafię wyodrębnić z nich nazwy hosta mimo iż jest w wynikach podawany. W podanym przeze mnie przykładzie wystarczy podać funkcji gethostbyname nazwę hosta by pobrać jego adres.
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
sobota, 11 czerwca 2016, 20:29
przez polymorphism
Albo jak użyć albo podglądnąć zapytania ARP ?
No to jest jakiś trop,choć u mnie nie wyświetla wszystkich adresów:
PMIB_IPNET_TABLE2 pipTable = NULL;
unsigned long status = GetIpNetTable2(AF_INET, &pipTable);
if (status == NO_ERROR)
{
for (int i = 0; i < pipTable->NumEntries; ++i)
{
std::cout << inet_ntoa(pipTable->Table[i].Address.Ipv4.sin_addr) << '\n';
}
FreeMibTable(pipTable);
}
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
sobota, 11 czerwca 2016, 22:33
przez Yari27
Dodaję odpowiedni nagłówek #include <iphlpapi.h> ale w nim nie ma takiej struktury PMIB_IPNET_TABLE2 ani funkcji GetIpNetTable2().
Za to znalazłem takie funkcje GetIpAddrTable() i GetIpNetTable() , jutro spróbuje ich użyć.
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
niedziela, 12 czerwca 2016, 10:27
przez polymorphism
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
Kolejność załączania nagłówków jest istotna.
GetIpNetTable to praktycznie to samo co
GetIpNetTable2, z tą różnicą, że nie obsługuje adresów IPv6... no i więcej pisania jest.
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
niedziela, 12 czerwca 2016, 14:02
przez Yari27
Bardzo szybko wyświetla listę adresów tylko że z 33 tylko 5 jest tak naprawdę używanych i 2 brakuje, reszta jest z całkiem innej puli, każdy adres jest po 2-4 razy.
Re: Szybkie wykrywanie IP w sieci lokalnej
Napisane:
piątek, 17 stycznia 2020, 20:48
przez allinone986
odchacą to pytania
jak łatwo odkrywać czyjęść IP
by nie dać mozliwosći logowania się na waszej stronie ?