You really don't want to code this yourself. Here is a trivial example for interest sake only. It shows you how to build a packet (and its checksum) and that you do get data back which as you can see it is encoded in a binary packet format.
use IO::Socket;
use constant ICMP_ECHO => 8;
use constant SUBCODE => 0; # No ICMP subcode for ECHO and ECHOR
+EPLY
use constant ICMP_STRUCT => "C2 n3 A64";
my $icmp = IO::Socket::INET->new( PeerAddr => 'perlmonks.org',
Proto=>'icmp'
);
print "Got socket\n";
my $data = '1'x64;
my $seq = 1;
my $checksum = 0;
my $msg = pack(ICMP_STRUCT, ICMP_ECHO, SUBCODE, $checksum, $$, $seq, $
+data);
$checksum = checksum($msg);
my $msg = pack(ICMP_STRUCT, ICMP_ECHO, SUBCODE, $checksum, $$, $seq, $
+data);
print "Sending: $msg\n";
$icmp->send($msg);
$icmp->recv(my $buf, 1500);
print "Got: $buf";
print "Done\n";
sub checksum {
my ($msg ) = @_;
my $len_msg = length($msg);
my $num_short = int($len_msg / 2);
my $chk = 0;
for my $short (unpack("n$num_short", $msg)) {
$chk += $short;
}
$chk += (unpack("C", substr($msg, $len_msg - 1, 1)) << 8) if $len_ms
+g % 2;
$chk = ($chk >> 16) + ($chk & 0xffff);
return(~(($chk >> 16) + $chk) & 0xffff);
}
|