Hallo zusammen,
ich versuche, Daten vom Netz zu holen. Diese Daten werden per UDP-Broadcast ins Subnetz gespült. Im tcpdump auf eth0 sieht das so aus:
11:03:15.885446 IP 10.40.3.5.2000 > 10.40.3.255.2000: UDP, length 1020
11:03:15.932432 IP 10.40.3.5.2000 > 10.40.3.255.2000: UDP, length 598
11:03:15.975834 IP 10.40.3.5.2000 > 10.40.3.255.2000: UDP, length 1025
11:03:16.025577 IP 10.40.3.5.2000 > 10.40.3.255.2000: UDP, length 1024
11:03:16.072304 IP 10.40.3.5.2000 > 10.40.3.255.2000: UDP, length 178
11:03:16.105481 IP 10.40.3.5.2000 > 10.40.3.255.2000: UDP, length 960
Mein Linux-Rechner hat die Adresse 10.40.3.250:
eth0 Link encap:Ethernet Hardware Adresse 00:19:99:xx:xx:xx
inet Adresse:10.40.3.250 Bcast:10.40.3.255 Maske:255.255.255.0
mein Perl5.10.0-Ansatz hierzu sieht wie folgt aus:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use strict;
use warnings;
use IO::Socket;
my($sock, $nachricht, $maxlen, $portno);
my $maxlen=1024;
$sock = IO::Socket::INET -> new (
PeerAddr => '10.40.3.255',
PeerPort => 2000,
Broadcast => 1,
Proto => 'udp') or die "socket-problem: $@";
while ($sock->recv($nachricht, $MAXLEN)) {
print "Message: %0x\n", $nachricht;
}
close($sock);
aber bei
$sock->recv wartet das Programm auf Daten und bekommt keine. Mit
LocalAddr geht's auch nicht, und es spielt auch keine Rolle ob ich
Broadcast=1 angebe oder nicht.
Ich bin sicher, dass ich kurz vor der Lösung stehe, aber mal wieder einen kleinen Denkfehler drin hab. Daher bitte ich euch um Hilfe. Wo liegt das Problem?
Sobald der Socket Daten empfängt, hab ich übrigens das nächste Problem: Die Daten werden byteweise vertauscht sein. Also statt
0xAABBCCDD werde ich
0xBBAADDCC erhalten. Ich hab früher viel Assembler programmiert, aber im Zusammenhang mit Netzwerken hätte ich diese LittleEndian-/BigEndian-Problematik am wenigsten erwartet... wie auch immer.
Kann ich dem socket gleich noch ein
unpack("S"...)oder was ähnliches mit auf den Weg geben? Und was passiert, wenn ein Paket eine ungerade Anzahl an Bytes lang ist?
Herzlichen Dank schonmal vorab.