Thread Broadcastdaten vom Netz holen (IPv4) (2 answers)
Opened by JoeMiller at 2011-05-11 10:13

JoeMiller
 2011-05-11 10:13
#148451 #148451
User since
2011-04-20
3 Artikel
BenutzerIn
[default_avatar]
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:
Code: (dl )
1
2
3
4
5
6
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:
Code: (dl )
1
2
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:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
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,
#   LocalAddr  => '10.40.3.250',
   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.

View full thread Broadcastdaten vom Netz holen (IPv4)