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

Szybkie wykrywanie IP w sieci lokalnej

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Yari27 » środa, 8 czerwca 2016, 13:08

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?
Avatar użytkownika
Yari27
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): niedziela, 19 lipca 2015, 20:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64bit
Kompilator: C++ Builder XE2 Update4
Gadu Gadu: 10382601
    Windows 7Chrome

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Cyfrowy Baron » środa, 8 czerwca 2016, 22:55

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);
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Yari27 » czwartek, 9 czerwca 2016, 10:41

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ń?
Avatar użytkownika
Yari27
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): niedziela, 19 lipca 2015, 20:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64bit
Kompilator: C++ Builder XE2 Update4
Gadu Gadu: 10382601
    Windows 7Chrome

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez polymorphism » czwartek, 9 czerwca 2016, 20:14

A jak pingujesz?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2179
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Yari27 » piątek, 10 czerwca 2016, 12:27

KOD cpp:     UKRYJ  
for (unsigned char l = 0; l < 65; l++) {
                ICMP2->Host = Edit1->Text+String(l);
                try {
                        ICMP2->Ping();
                } catch (...) {;}

}
Avatar użytkownika
Yari27
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): niedziela, 19 lipca 2015, 20:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64bit
Kompilator: C++ Builder XE2 Update4
Gadu Gadu: 10382601
    Windows 7Chrome

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez polymorphism » piątek, 10 czerwca 2016, 14:20

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2179
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Yari27 » piątek, 10 czerwca 2016, 15:39

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.
Avatar użytkownika
Yari27
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): niedziela, 19 lipca 2015, 20:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64bit
Kompilator: C++ Builder XE2 Update4
Gadu Gadu: 10382601
    Windows 7Chrome

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez polymorphism » piątek, 10 czerwca 2016, 19:06

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?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2179
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Yari27 » sobota, 11 czerwca 2016, 15:27

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 ?
Avatar użytkownika
Yari27
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): niedziela, 19 lipca 2015, 20:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64bit
Kompilator: C++ Builder XE2 Update4
Gadu Gadu: 10382601
    Windows 7Chrome

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Cyfrowy Baron » sobota, 11 czerwca 2016, 15:55

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4727
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 444
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez polymorphism » sobota, 11 czerwca 2016, 20:29

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);
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2179
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Yari27 » sobota, 11 czerwca 2016, 22:33

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ć.
Avatar użytkownika
Yari27
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): niedziela, 19 lipca 2015, 20:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64bit
Kompilator: C++ Builder XE2 Update4
Gadu Gadu: 10382601
    Windows 7Chrome

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez polymorphism » niedziela, 12 czerwca 2016, 10:27

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2179
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows 7Firefox

Re: Szybkie wykrywanie IP w sieci lokalnej

Nowy postprzez Yari27 » niedziela, 12 czerwca 2016, 14:02

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.
Avatar użytkownika
Yari27
Bladawiec
Bladawiec
 
Posty: 23
Dołączył(a): niedziela, 19 lipca 2015, 20:54
Podziękował : 6
Otrzymał podziękowań: 0
System operacyjny: Windows 7 64bit
Kompilator: C++ Builder XE2 Update4
Gadu Gadu: 10382601
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron