• Publicidad

Obtener IP de un paquete UDP

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Obtener IP de un paquete UDP

Notapor perleando_apenas » 2009-06-03 18:13 @800

Hola a todos.

Estoy trabajando con sockets UDP y por ellos estoy recibiendo paquetes SNMP.

Necesito analizar estos paquetes para saber cuál es el IP/puerto de origen del paquete que llegó al host.

Tengo el mensaje en la variable $newmsg que acabo de recuperar del socket y este es el código con el que estoy probando:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
...
use NetPacket::Ethernet qw(:strip);
use NetPacket::IP;
use NetPacket::UDP;
...
my $ip_datagram = NetPacket::IP->decode( NetPacket::Ethernet::eth_strip( $newmsg ) );
foreach ( keys %$ip_datagram ) { print "$_|$ip_datagram->{$_}\n"; }
...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Ahora, cuando ejecuto y envío un mensaje desde otro host, mi código imprime esto:

    len|1094
    dest_ip|16.6.12.43
    options|
    ttl|1
    src_ip|0.48.18.48
    tos|2
    id|49598
    Use of uninitialized value in concatenation (.) or string at ./snmp_agent.pl line 163.
    _parent|
    hlen|0
    proto|0
    foffset|59408
    flags|2
    ver|2
    cksum|513
    ...

(data y _frame no los puse porque muestran caracteres "no imprimibles", pero no es problema pues la data snmp ya la estoy recuperando con NSNMP).

Mi problema es que los campos src_ip y dest_ip están teniendo valores que sé que son incorrectos (porque reviso el paquete recibido con tshark por otro lado).

He visto varios códigos escritos en Perl que utilizan NetPacket y claramente estoy haciendo algo mal o me falta algo antes de hacer la llamada a decode, pero no sé qué es. Ahora, también recibo sugerencias respecto de usar módulos distintos a NetPacket o funciones de IO::Socket que aún no descubro :)

Agradeceré mucho su ayuda.

Saludos.
perleando_apenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2009-04-17 10:27 @477

Publicidad

cri cri ...

Notapor perleando_apenas » 2009-06-04 12:14 @551

¡Hola!...

Aún no puedo encontrar el error :(

Por favor, si alguno tiene una idea de cuál puede ser el problema les agradeceré decirme pues en la documentación y en Google no he encontrado nada que me sirva.
perleando_apenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2009-04-17 10:27 @477

Pregunto y me respondo.

Notapor perleando_apenas » 2009-06-04 17:22 @765

Jóvenes... por si a alguien le sirve más adelante...

Ya encontré la solución. La verdad es que me estaba complicando sin necesidad.

En términos generales, mi programita abre un objeto Select con 2 sockets. Al iniciar entra a un ciclo con el Select y cuando llega algo para alguno de los dos sockets ejecuta un recv(). Bueno, la función recv() retorna lo que necesito ... ¡XAN!

Según http://search.cpan.org/~nwclark/perl-5.8.9/pod/perlfunc.pod: "Returns the address of the sender if SOCKET's protocol supports this; returns an empty string otherwise."

Así que bueno... el código se ve algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $alarm_sock = IO::Socket::INET->new (
                                 Hostname => $SRV_HOST,
                                 LocalPort => $SRV_PORT,
                                 Proto => 'udp'
                                 ) or die "socket: $@";
print "Awaiting UDP messages (alarms) on port $SRV_PORT\n";

my $get_sock = IO::Socket::INET->new (
                                 Hostname => $SRV_HOST,
                                 LocalPort => $GET_PORT,
                                 Proto => 'udp'
                                 ) or die "socket: $@";
print "Awaiting UDP messages (gets) on port $GET_PORT\n";

my $selector = new IO::Select ( $alarm_sock, $get_sock );
$|=1; #no flush

while (my @ready = $selector->can_read ) {
  foreach my $fh ( @ready ) {
    my $r = $fh->recv(my $buf, $MAXLEN);  # <== AQUÍ OBTENGO LO QUE NECESITO
    my ($port, $h) = sockaddr_in($r);
    my $ip = inet_ntoa($h);

    if ( $buf eq "stop\n" ) {
      print "Ending UDP server ...\n";
      close($alarm_sock);
      close($get_sock);
      exit 0;
    }

    if ( $fh == $alarm_sock ) {
      alarm_received ( $buf );
    }
    else {
      get_received ( $buf, $ip, $port );
    }
  }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Bueno, sigo trabajando en mi agente así que lo más probable es que continúen apareciendo más problemas.

Saludos.
perleando_apenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2009-04-17 10:27 @477


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 25 invitados

cron