Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Una sorta di network scanner

    Ciao ragazzi,

    sto scrivendo una sorta di network scanner ma ho un piccolo problema con questa funzione (o meglio, con il tempo di esecuzione della stessa)

    char *Get_Host_By_Addr(char *Host_IP)
    {
    struct in_addr In_Addr;
    struct hostent *Host;

    In_Addr.s_addr = inet_addr( Host_IP );
    Host = gethostbyaddr( (char *)&In_Addr, sizeof(In_Addr), AF_INET );
    if ( Host == NULL )
    return "";
    else
    return Host->h_name;
    }

    molto semplicemente passo l'IP e mi torna il nome host, molto banale.
    Il problema è la lentezza. Mi torna il nome dopo 1, 2 secondi.

    Pensate quando la ciclo su tutto il range di IP.

    Come posso renderlo più rapido? se esiste un modo.

    Grazie a tutti, Michele

  2. #2
    Per il pezzo di codice che hai postato non ci sono poi tante migliorie da apportare , tranne forse quella che calcola la taglia della struttura In_Addr . Non credo che la lentezza del codice sia imputabile all'istruzione sizeof(In_Addr) .
    Devi quindi rivolgere l'attenzione alle funzioni chiamate dal tuo codice , ossia : inet_addr() e gethostbyaddr() . Saluti

  3. #3
    Ciao!

    Grazie per la risp ma... come posso mettere mano a quelle funzioni? (provengono da WinSock.h)
    Hai dei consigli?

    io nel frattempo sto elaborando altre vie tipo:
    - chiedere al router (ma come???) l'elenco degli host attivi in modo da scartare quelli down
    - impostare un timout di attesa della risp (ma come???): in modo che se un host non risp entro x la richiesta viene scartata
    - lanciare 255 processi contemporaneamente (ma come???) ognuno interroga un host quindi al max il ritardo sarebbe pari all'host più lento.

    boh sono tutte supposizioni teoriche che al momento non saprei come implementare.

    accetto consigli

  4. #4
    Non conosco C quindi a livello di codice non ti posso dare una mano pero posso suggerirti alcuni spunti:
    La risoluzione dei nomi la attui per mezzo una query DNS (ipotizzo per mezzo di gethostbyaddr()), esatto?
    Invece di mandare subito la query perchè non pinghi dapprima tutti e 255 gli host? Successivamente effettui la query DNS ai soli host che risultano essere up.
    Per effettuare più operazioni in contemporanea esiste il multi threading, sicuramente implementabile in C, componente onnipresente in qualunque scanner analogo, ma per soli 255 host interni alla tua LAN non credo che tu ne abbia veramente bisogno.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  5. #5
    grazie del consiglio ma credi sia più performante pingare gli host che eseguire una query DNS?

    se sì mi metto al lavoro.

  6. #6
    Non so quale sia più veloce tra i due. Essenzialmente fanno la medesima cosa: icmp manda un icmp echo e riceve icmp un reply, dns manda una dns query e riceve una dns query response.
    Il dubbio che però mi sorge riguarda proprio la "risoluzione dei nomi" interna alla LAN che tu hai citato.
    Spero di non dire una cantonata ma gli "hostnames" sono presenti solo in internet, non in LAN.
    In una LAN al massimo possono esistere "computer name" e "netbios name" che però concettualmente non sono la medesima cosa (ad es: il nome netbios di un computer può essere ottenuto da una netbios table querando un SMB server, non un server DNS, e in quel caso non dovresti utilizzare il protocollo DNS bensì SMB).
    Spero di non aver sbagliato facendo queste considerazioni. In tal caso.. che qualcuno mi coregga!

    Tu di preciso cosa vuoi fare? Un network scanner che ti identifichi tutte le macchine "up" e che poi faccia una delle risoluzioni di quelle sopra citate (ip--> hostname, ip-->netbiosname, ip-->computername)?
    ...O vuoi includere anche una funzione di scanning delle porte? Se si TCP o UDP? Dai più info.

    Al di là di tutto, almeno per la parte relativa alla raggiungibilità, personalmente opterei per ICMP a prescindere. In tutti i network/port/security/* scanner che ho visto il primo passo che compie lo scanner è appunto quello di pingare preventivamente la macchina per verificarne la raggiungibilità e per quello viene ovviamente impiegato lo spartano ma sempre appropriato ICMP.


    Saluti
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  7. #7
    Probabilmente ho utilizzato erroneamente Host Name rispetto a computer Name.

    L'applicazione che intendo sviluppare ha il semplice compito di tornare un array con gli IP e i nomi delle macchine "up" in una rete LAN.

    Ti ringrazio di cuore per tutte le considerazioni e le info e convengo con te sull'utilizzo del PING precedentemente alla risoluzione del nome. Quantomeno è più elegante concettualmente.

    Buona giornata, mi metterò al lavoro e ti aggiornerò.

    Michele

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.