perl udp socket recv binary data
vlad
- perl
0 hotti3 Christian Kruse
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
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
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