Status checker for hundreds IP addresses

前端 未结 10 1517
长发绾君心
长发绾君心 2021-01-02 01:52

I wonder how to make a status checker, checking about 500 addresses in a few minutes? (it\'ll check a certain port if its listening).

But I care about the performanc

相关标签:
10条回答
  • 2021-01-02 02:19

    The by far most efficient way to do this is to use raw sockets, however this requires administrative privileges and some boilerplate coding. You choose a local port as the source, send a SYN packet to port 80 of each target address, and collect the return packets on the source port. If they have an ACK flag, the port is open for connections. If they have RST or they don't return, the port isn't open/the host is dead.

    Obviously you will need to manually wait for whatever your "timeout" of choice is as this method goes around the OS network stack. This also requires you to construct the TCP and IP headers manually, though, and I doubt it can be done from PHP. It can certainly be done in C, and I believe C# also supports raw sockets (haven't done it in C# myself).

    This is extremely fast and doesn't pollute the system with a bunch of open connections or threads.

    0 讨论(0)
  • 2021-01-02 02:25

    The best way to this would be nmap, as mentioned in other answers.

    You'd want to run it like this (-PN is don't ping, -sP means to skip the port scan and just check if the host is up, -PS80 means to check port 80, -n is not to do reverse DNS lookup, -oG - is to output in machine readable format, and the other arguments are IP addresses or hostnames):

    nmap -PN -sP -PS80 -n -oG - --send-ip IP1 IP2 ...
    

    And it would look like this:

    $ nmap -n -PN -sP -PS80 -oG -  209.85.147.104 87.248.122.122 4.4.4.4
    # Nmap 5.21 scan initiated Tue Feb 21 01:07:20 2012 as: nmap -n -PN -sP -PS80 -oG - 209.85.147.104 87.248.122.122 4.4.4.4 
    Host: 209.85.147.104 () Status: Up
    Host: 87.248.122.122 () Status: Up
    Host: 4.4.4.4 ()    Status: Down
    # Nmap done at Tue Feb 21 01:07:21 2012 -- 3 IP addresses (2 hosts up) scanned in 0.95 seconds
    

    You could run and parse this from PHP with no trouble. I'm not very experienced in PHP, and haven't tested this, but here's some example code:

    <?php
    $output = shell_exec('nmap -n -PN -sP -PS80 -oG - --send-ip ' . implode(" ", $ips));
    $result = array();
    foreach(preg_split("/\r?\n/", $output) as $line) {
        if (!(substr($line, 0, 1) === "#")) {
            $info = preg_split("[\t ]", $line);
            $result[$info[2]] = ($info[5] === "Up");
        }
    }
    ?>
    

    Mind you, writing PHP code or C# code or whatever that does this isn't a big deal, it's just that nmap is very very good at what it does, and extremely versatile, that writing code that does this is reinventing the wheel. If you do decide to go that route, make sure you make your code asynchronous, otherwise one slow server would slow down your entire sweep.

    0 讨论(0)
  • 2021-01-02 02:27

    PHP should be able to check 500 ips in pretty short amount of time, but it really depends on your internet connection and other specs. Other tools written in lower languages would be a little faster, but I think that php is good for the job. You must just set php execution limit to a suitable value before trying

    0 讨论(0)
  • 2021-01-02 02:30

    The best thing you can do is start a number of threads (you decide the number; probably more than 10 and less than a 100). Doing scanning on different threads will speed up your check. I am not sure if you can do multi-threading in php. If not, then c# would be better.

    0 讨论(0)
提交回复
热议问题