CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Szybkie wykrywanie IP w sieci lokalnej
Strona 1 z 1

Szybkie wykrywanie IP w sieci lokalnej

Nowy postNapisane: ś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

Nowy postNapisane: środa, 8 czerwca 2016, 22:55
przez Cyfrowy Baron
KOD cpp:     UKRYJ  
__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

Nowy postNapisane: 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

Nowy postNapisane: czwartek, 9 czerwca 2016, 20:14
przez polymorphism
A jak pingujesz?

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postNapisane: piątek, 10 czerwca 2016, 12:27
przez Yari27
KOD cpp:     UKRYJ  
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

Nowy postNapisane: 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

Nowy postNapisane: 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

Nowy postNapisane: 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

Nowy postNapisane: 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

Nowy postNapisane: 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

Nowy postNapisane: 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:
KOD cpp:     UKRYJ  
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

Nowy postNapisane: 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

Nowy postNapisane: niedziela, 12 czerwca 2016, 10:27
przez polymorphism
KOD cpp:     UKRYJ  
#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

Nowy postNapisane: 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

Nowy postNapisane: 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 ?