socket(PF_PACKET,SOCK_RAW...) - für welches Device?

Herakles

Profifragensteller
Moin!

Eine Frage zum Thema Netzwerkprogrammierung: wenn ich ein

socket(PF_PACKET, SOCK_RAW,...)

ausführe, bekomme ich einen Filedescriptor für das geöffnete socket zurück. WIE sage ich dem Rechner denn, für welches Netzwerkinterface er dieses Socket anlegen soll?

Ich meine, das öffnet mir den Socket, aber zu welcher Karte im Rechner ist dieser denn nun assoziiert, also über welches Device liefe eine Kommunikation?

Oder verstehe ich da irgendetwas grundlegend falsch?


Danke, Herakles
 
Hallo Herakles,
wenn ich mich recht entsinne ist nach dem Aufruf von socket(), der Socket noch nicht gebunden.
Erst durch den Aufruf von bind(), bindest du den Socket an ein Interface.

Lies dir mal die ensprechenden man-pages durch.

Grüsse
 
Das ist natürlich korrekt. Ohne bind kein binden an ein Interface. Problem bei

socket(PF_PACKET,SOCK_RAW,...)

ist jedoch, dass man sich an kein struct sockaddr_in binden kann, da man auf OSI-Layer 2 arbeitet und es da nach meinem Verständnis noch gar keine IP-Adressen gibt, an die man sich binden könnte.

Nach meinem Verständnis wäre das so, wenn ich mit bind() an eine Adresse wie etwa 192.168.1.2 binde, dass das Socket dann für die Adresse gebunden wird, die den gleichen Adressbereich hat.

Wäre es zum Beispiel so, dass ich 2 Netzwerkkarten habe, eine auf 192.168.1.1 konfiguriert und einen auf 192.168.2.1, dann würde automatisch die richtige Adresse hinsichtlich der bei bind() übergebenen struct sockaddr_in genutzt, also das entsprechende Interface.

Wenn ich nun aber noch gar keine IP vergeben habe, weil ich in Layer 2 bin, wie binde ich dann???
 
Hallo Herakles,

Hast du denn mal ein bind() versucht, und schlägt es fehl?


Was willst du eigentlich mit dem Raw-Socket machen?

Paketsniffing, oder Paketinjection?

Dann kannst ja mal die Quellcodes von libnet oder libpcap studieren,
und dir anschauen wie die das machen. Bzw. gleich diese libs verwenden...
ist bedeutend komfortabler :cool:

Unter http://www.packetfactory.net/ (libnet)
und http://www.tcpdump.org/ (libpcap)

gibt es super Tutorials

Hoffe das hilft dir weiter
 
Nachtrag:

Es müsste mit bind funktionieren.
http://www.zotteljedi.de/doc/socket-buch.pdf
Kapitel 13 liefert dir nähere Infos.

Falls dich trotzdem doch die libpcap oder die libnet interessieren...
Habe da selbst einmal in meinem Studium einen Vortrag mit Tutorials geschrieben... Hat ich schon ganz vergessen :D
Liegt hier: http://www.korpustoby.de/andi/
Dürfte mittlerweilen ziemlich veraltet sein.... Dafür kompakt und auf deutsch.

Hoffe deine Probleme sind gelöst
 
@andICode: zunächst einmal Danke für Deinen Enthusiasmus und Deine Hilfe. Sehr freundlich von Dir.

Nun, was habe ich vor? Ich möchte einen WLAN-Netzwerktreiber hinsichtlich Roaming erweitern. Es soll die Möglichkeit bestehen, sich gleichzeitig zu zwei verschiedenen APs zu verbinden und während dieser Verbindung mittels eines Testdatenpaketes herausgefunden werden, welcher AP in besserer Reichweite ist, also die bessere Verbindung bietet. Deine pcap-libraries sind sicher eine gute Anlaufstelle, da ich erst seit etwa einem Monat in der Materie bin und mich eigentlich noch in der Einarbeitungsphase bezüglich Netzwerkprogrammierung befinde.

So wie ich die Sache momentan sehe, werde ich zunächst versuchen, ein Userland-Programm zu entwickeln, das meine gewünschten Fähigkeiten abdeckt. Habe ich das realisiert, oder zumindest verstanden, was dafür zu tun wäre, dann ist das Ganze wohl auf Treiberebene zu portieren... Aber das ist sicher noch ein weiter Weg.

Ich werde Deinen Links folgen und viel, viel lesen. Herzlichen Dank nochmal!

Herakles
 
@herakles
Ich wünsche dir viel Erfolg bei deinem Vorhaben.
An Enthusiasmus mangelt es dir ja auch nicht, das du dich extra in die Materie einarbeitest, nur um dein Vorhaben zu realisieren.
Da es bei deinem Projekt um WLAN geht kannst du dir ja auch mal
das zu gemüte führen: http://www.dachb0den.com/projects/bsd-airtools.html
Da ich mal annehme das dein Projekt unter irgendeinem BSD laufen soll.

Gruß andIcode
 
Zurück
Oben