- 论坛徽章:
- 27
|
- use Socket;
- my $pid = $ & 0xffff;
- socket(SOCK,PF_INET,SOCK_RAW,getprotobyname('icmp'));
- my $saddr = sockaddr_in(0,inet_aton('8.8.8.8'));
- my $msg = pack("C2 n3",8,0,0,$pid,1);
- my $send_msg = checksum($msg);
- $msg = pack("C2 n3",8,0,$send_msg,$pid,1);
- send(SOCK,$msg,0,$saddr);
- recv(SOCK,$buff,1500,0);
- my($icmp_type, $icmp_subcode,$icmp_cksum,$icmp_pid,$icmp_seq) = unpack("C2 n3",substr($buff,20,8));
- close(SOCK) ;
- sub checksum {
- my ($msg) = @_;
- my ($len_msg, $num_short, $short, $chk);
- $len_msg = length($msg);
- $num_short = int($len_msg / 2);
- $chk = 0;
- foreach $short (unpack("n$num_short", $msg)){
- $chk += $short;
- }
- $chk += (unpack("C", substr($msg, $len_msg - 1, 1)) << 8) if $len_msg % 2;
- $chk = ($chk >> 16) + ($chk & 0xffff); # Fold high into low
- return(~(($chk >> 16) + $chk) & 0xffff); # Again and complement
- }
复制代码 |
|