smackdab has asked for the wisdom of the Perl Monks concerning the following question:
Hi Monks,
I am trying to get the ICMP host unreachable msg back when I send a message to a UDP host:port that isn't listening... I have tried a bunch of things, including reading: Network Programming with Perl by Lincoln D. Stein. But, networking is something I am still very new at...
Here is my sample app, if anyone can kick me over the hump, I would appreciate it ;-)
I am trying to get the ICMP host unreachable msg back when I send a message to a UDP host:port that isn't listening... I have tried a bunch of things, including reading: Network Programming with Perl by Lincoln D. Stein. But, networking is something I am still very new at...
Here is my sample app, if anyone can kick me over the hump, I would appreciate it ;-)
# # How to get an ICMP host unreachable packet??? # use IO::Select; use IO::Socket; use strict; use warnings; my $sock_udp = IO::Socket::INET->new(Proto=>'udp'); print "created udp=$sock_udp\n"; my $sock_icmp = IO::Socket::INET->new(Proto=>'icmp'); print "created icmp=$sock_icmp\n"; my $select = IO::Select->new(); my $host = '192.168.0.4'; my $port = 2; my $rbits = 0; my $aton = inet_aton($host); my $addr = sockaddr_in($port, $aton); $sock_udp->connect($addr) or die "$!\n"; #Unix socket faq says udp +must be "connected" to get icmp msg print " udp 'connected' to $host:$port\n"; #http://www.unixprogram.co +m/socket/socket-faq.html#faq55 $select->add($sock_icmp); $select->add($sock_udp); vec($rbits, $sock_icmp->fileno(), 1) = 1; vec($rbits, $sock_udp->fileno(), 1) = 1; $sock_udp->send("test", 0) or die "$!\n"; print " send test msg to $host:$port\n"; # select attempt my $found = select($rbits, undef, undef, 1); if ($found > 0) { my $msg = ""; my $size = 1500; my $from_icmp = recv($sock_icmp, $msg, $size, 0) or die "$!\n"; my $from_udp = recv($sock_icmp, $msg, $size, 0) or die "$!\n"; my ($from_port, $from_ip) = sockaddr_in($from_icmp); # I need to unpack the packet here I think... } # io::select attempt my @found = $select->can_read(); foreach (@found) { print " got a can_read on socket=$_\n"; my $msg = ""; my $size = 1500; #my $from_icmp = recv($sock_icmp, $msg, $size, 0) or die " $!\n +"; my $from_udp = recv($sock_icmp, $msg, $size, 0) or die " $!\n"; my ($from_port, $from_ip) = sockaddr_in($from_udp); # I need to unpack the packet here I think... } #If you can figure this out, here is another question: #I want to scan more than 1 machine for a certain open UDP ports #(for use internally at my business and I want to write it myself and +not use the awesome nmap...) #Should I create a new UDP socket for each host I want to test? #and then wait in the select loop? #The reason I ask is that I expect to get stuck on determinig #what hosts/ports replied back as ICMP unreachable... #I am not there yet, but expect to get stuck ;-)
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: udp recv question
by tachyon (Chancellor) on Jun 28, 2004 at 01:05 UTC | |
by smackdab (Pilgrim) on Jun 28, 2004 at 01:46 UTC | |
by tachyon (Chancellor) on Jun 28, 2004 at 02:50 UTC | |
by smackdab (Pilgrim) on Jun 28, 2004 at 03:30 UTC | |
by tachyon (Chancellor) on Jun 28, 2004 at 04:22 UTC | |
| |
by JamesNC (Chaplain) on Jun 28, 2004 at 04:13 UTC | |
Re: udp recv question
by dave_the_m (Monsignor) on Jun 28, 2004 at 11:08 UTC | |
by smackdab (Pilgrim) on Jun 29, 2004 at 02:57 UTC | |
by JamesNC (Chaplain) on Jun 29, 2004 at 10:30 UTC | |
by dave_the_m (Monsignor) on Jun 29, 2004 at 12:31 UTC |
Back to
Seekers of Perl Wisdom