vlad: perl udp socket recv binary data

Hi,
wie kann man mit der perl recv funktion binärdaten empfangen?

Ich habe im netz folgendes Programm gefunden, weil ich einfach eine simple Möglichkeit wollte, udp packets zu dumpen, um die Ausgaben eines Tools,was ich gerade schreibe zu sehen

  
`#! /usr/bin/perl  
use warnings;  
use strict;  
  
use Socket qw(:all);  
  
$|++; # no suffering from buffering  
  
my $udp_port = 666;  
  
socket( UDPSOCK, PF_INET, SOCK_DGRAM, getprotobyname('udp') ) or die "+socket: $!";  
  
select( ( select(UDPSOCK), $|=1 )[0] ); # no suffering from buffering  
  
setsockopt( UDPSOCK, SOL_SOCKET, SO_REUSEADDR, 1 )  
    or die "setsockopt SO_REUSEADDR: $!";  
my $broadcastAddr = sockaddr_in( $udp_port, INADDR_ANY );  
bind( UDPSOCK, $broadcastAddr ) or die "bind failed: $!\n";  
  
my $input;  
while( my $addr = recv( UDPSOCK, $input, 4096, 0 ) ) {  
    my $hexstr = $input;  
    $hexstr =~ s/(.)/sprintf("%02x",ord($1))/eg;  
    print "$addr => $hexstr - $input\n";  
}  

Mein Problem ist, dass die Variable $input ein string ist, anstatt ein byte array.

Der Sender verschickt ein uint32 und das perl Programm empfängt nur das zuerst gesendete byte, wenn das 2. 0 ist

wie komme ich hier weiter?

Gruß
Vlad

  1. hi,

    Der Sender verschickt ein uint32 und das perl Programm empfängt nur das zuerst gesendete byte, wenn das 2. 0 ist

    wie komme ich hier weiter?

    Ungetestet: Setze das Flag O_BINARY

    Hotti

  2. Moin vlad,

    Mein Problem ist, dass die Variable $input ein string ist, anstatt ein byte array.
    Der Sender verschickt ein uint32 und das perl Programm empfängt nur das zuerst gesendete byte, wenn das 2. 0 ist

    Das Problem ist die Typen-Abstraktion von Perl. Du musst hier den String umwandeln in einen Integer, dafür gibt es mehrere Möglichkeiten: entweder „von Hand” indem du den ord()-Wert shiftest und orst:

      
    my @bytes = (chr(0x10), chr(0x00), chr(0x80), chr(0x00));  
    my $int = 0;  
      
    foreach my $b (@bytes) {  
      $int = $int << 8 + ord($b);  
    }  
      
    print $int,"\n";  
    
    

    Hier stellst du händisch den int32 wieder zusammen. Oder du verwendest die dafür vorgesehene Funktion unpack():

      
    my $bytes = chr(0x10) . chr(0x00) . chr(0x80) . chr(0x00);  
    my ($int) = unpack("N", $bytes);  
      
    print $int, "\n";  
    
    

    Beachte, dass das sehr Plattform-abhängig ist, Stichwort Little und Big Endian.

    LG,
     CK