ICMP Checksum, calculation

From: Date: Thu, 04 Aug 2005 08:20:17 +0000
Subject: ICMP Checksum, calculation
Groups: php.general 
Request: Send a blank email to php-general+get-220010@lists.php.net to get a copy of this message
I've wanted to make a ping 'program' in PHP, so after reading up on this, it occured to me that the only difficult thing was to calculate the ICMP checksum. So after some heavy reading I could calculate this by pen and paper. And after some hours trying to make my calculations into PHP code, I discovered this piece of code in the online doc: (by Khaless [at] bigpond [dot] com) http://dk2.php.net/manual/en/ref.sockets.php <?PHP // Computes Internet Checksum for $data // will return a 16-bit internet checksum for $data function inetChecksum($data) { // 32-bit accumilator, 16 bits at a time, adds odd bit on at end for($i=0;$i<strlen($data);$i += 2) {
       if($data[$i+1]) $bits = unpack('n*',$data[$i].$data[$i+1]);
       else $bits = unpack('C*',$data[$i]);
       $sum += $bits[1];
} // Fold 32-bit sum to 16 bits while ($sum>>16) $sum = ($sum & 0xffff) + ($sum >> 16); $checksum = pack('n1',~$sum); return $checksum; } ?> Now, after discovering the unpack function it all became a lot easier, so I've made my own checksum calculator, which works approximatly 5 times as fast (and it dosn't have the for loop limitation of data length), and all the tests I've done it gives the same result as above: <?php function myChecksum($data) {
    $bit = unpack('n*', $data);
    $sum = array_sum($bit);
    if (strlen($data)%2) {
        $temp = unpack('C*',$data[strlen($data)-1]);
        $sum += $temp[1];
    }
    // The next 2 lines of code, is stolen from the
    // original ping program written in C
    // Stolen code start:
    $sum = ($sum >> 16) + ($sum & 0xffff);
    $sum += ($sum >> 16);
    // End of stolen code
    return pack('n*', ~$sum);
} ?> Can anyone tell me, if there will be any example, where the 2 functions wont give the same output? The piece of code I think could be the most trouble is the piece I've stolen, in the other function there's a while loop, so if I a very long data input, it wouldn't be the same output, but I've tried with large strings and they still give the same. So to sum up, will the 2 functions always calculate the same. -- Philip Birk-Jensen URL: http://birk-jensen.dk ICQ: 14789099

« previous php.general (#220010) next »