[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Perl Net::RawIP kastriert?



Also um dir wirklich helfen zu können müsstest du schon mehr
Informationen liefern.

> Es gab eine "sendto() at /usr/local/lib/perl/5.10.1/Net/RawIP.pm line
> 630."-Meldung und das Paket wurde nicht gesendet.

Es gibt bei Net::RawIP ein Bug-Report. Dieser behandelt zwar einen
anderen "Fehler" allerdings wird dort die Fehlermeldung erwähnt wann sie
kommt.

> When using the send subroutine in this module and connecting to an IP
> address that the "ping" tool on the command line reports as "Network is
> unreachable" the code always ends with this message:-
> 
> sendto() at
> /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Net/RawIP.pm line
> 630.

Wobei ich nicht aussließen würde das dies das einzige Problem sein kann
wann dieser Fehler auftritt.

>> Soweit ich weiß dürfen RAW-Packete nur als root Nutzer versendet werden.
>> Als Benutzer muss man auf die High-Level Socket Implementierung zurück
>> greifen.
> Offensichtlich.

Heißt das nun das jetzt alles geht?


Also hier mal ein Test-Beispiel was ich eigentlich von dir erwartet
hätte. Dieses Test-beispiel sendet lokal daten und empfängt lokal die daten.

Erstens der Server um gefilterte Packete zu erhalten.

> use AnyEvent::Pcap;
> 
> my $pcap;
> $pcap = AnyEvent::Pcap->new(
>     device         => "lo",
>     filter         => "tcp port 8080",
>     packet_handler => sub {
>         my $header = shift;
>         my $packet = shift;
> 
>         # you can use utils to get an NetPacket::TCP object.
>         my $tcp = $pcap->utils->extract_tcp_packet($packet);
>         $tcp->parse_tcp_options;
>         printf "DATA: %s\n", $tcp->{data};
>     }
> );
> $pcap->run();
> 
> # Event-Loop - Programm mit STRG+C abbrechen
> AnyEvent->condvar->recv;

Dieser horcht auf Port 8080 auf dem loopback Device. Für jedes
TCP-Packet das empfangen wird, wird die Callback-Routine aufgerufen. In
diesem Beispiel werden die TCP-Data Daten ausgegeben.

Zum senden folgendes Programmes

> use Net::RawIP;
> 
> my $n = Net::RawIP->new({
>     ip  => {
>         saddr => '192.168.0.100',
>         daddr => '192.168.0.100',
>     },
>     tcp => {
>         source => 8080,
>         dest   => 8080,
>         psh    => 1,
>         syn    => 1,
>         data   => $ARGV[0] || 'test',
>     },
> });
> $n->send;

Die IP-Adressen musst du entsprechend bei dir anpassen. Beides muss als
Root laufen. Der Server zum empfangen weil er mit Pcap auf das lo Device
snifft und das Sende-Programm weil es RAW-Packete versendet.

Wenn ich den Server starte und das programm ausführen zum versenden.

> root@sid:/home/sidburn/perl# ./netrawip.pl foo
> root@sid:/home/sidburn/perl# ./netrawip.pl bar

Beim Server sieht man folgende Ausgaben wenn man oberes ausführt.

> root@sid:/home/sidburn/perl# ./anyeventpcap.pl 
> DATA: foo
> DATA: bar

Bei mir funktioniert das empfangen und versenden jedenfalls einwandfrei.
Am besten du stellst ersteinmal selber sicher ob ein lokaler empfang und
versand einwandfrei geht. Wenn dieser Test einwandfrei läuft dann musst
du in deinem Netzwerk schauen wo die Packete eventuell verworfen werden.


Reply to: