www.mikrocontroller.net

Forum: PC-Programmierung Netzwerkprogrammierung - RawSocket


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Andre (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo zusammen.

Ich hoffe, Ihr könnt mir helfen. Ich schreibe gerade eine Software für 
einen 32-Bit embedded-Controller. Diese werden später Teilnehmer in 
einem Netzwerk sein und untereinander kommunizieren. Die Kommunikation 
soll schon vor Vergabe von IP-Adressen möglich sein. Soll über die 
MAC-Adressen gehen. Soviel dazu. die Kommunikation klappt auch schon 
soweit. Um an dem MAC-Adressen Änderungen vornehmen zu können, muss ich 
sog. Packet-Sockets verwenden und auf OSI-Layer 2 arbeiten.

Schicke ich eine Nachricht allerdings per Broadcast ins Netz, kommt sie 
nirgends an. Schicke ich die Nachricht an eine bestimmte Adresse, wird 
sie auch empfangen.

Jetzt kommt das kuriose. Arbeite ich mit einem normalen Socket und 
schicke eine Nachricht per Broadcast heraus, werden sämtliche 
Informationen (MAC, IP etc.) vom System gesetzt. Diese Nachricht kommt 
allerdings an.

Die Mitschnitte in Wireshark sehen allerdings 100% identisch aus 
(Vergleich der Rohdaten). Kann mir da wirklich nicht mehr helfen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Andre schrieb:
> Schicke ich eine Nachricht allerdings per Broadcast ins Netz, kommt sie
> nirgends an.

Andre schrieb:
> Die Mitschnitte in Wireshark sehen allerdings 100% identisch aus
> (Vergleich der Rohdaten).

D.h. es ist im Netz mit wireshark sichtbar, nur der Empfänger merkt 
nichts davon?

Dann liegt es offenbar an der Empfängerseite.
Wer ist jetzt der Empfänger? Dein MC, oder ein PC?
Wie sieht der Empfang denn aus?

Für welche Protokollnummer soll das denn gemacht werden?

Autor: Andre (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Klaus

Das Kuriose an der Sache ist, dass lt. Wireshark alle Pakete den 
Empfänger verlassen. auf dem Zielrechner läuft auch Wireshark. Dort 
kommen aber nur die Pakete mit direkter Adresse an. Broadcast-Telegramme 
erreichen ihr Ziel nicht. Werden aber alle über den selben RAW-Socket 
gesendet.

Beispiel:

Folgendes funktioniert:
Rechner A |---------Message an 192.168.1.3 --------> Ziel (192.168.1.3)

Folgendes funktioniert nicht:
Rechner A |---------Message an 255.255.255.255-----> Ziel (192.168.1.3)

Ich kann mir nur nicht erklären wieso?

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hast du einen Switch dazwischen?

Außerdem: wenn du ein Broadcast an dein lokales Netz senden willst, geht 
das doch an 192.168.1.255, oder nicht?

Ein Broadcast an das Internet wird hoffentlich nicht weit kommen :-)

Autor: Phil (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hi Andre,

deine Beschreibung ist ein klein wenig verworren. Du schreibst du 
arbeitest mit SOCK_PACKET. Aber wieso sendest du nun Broadcastpackets 
mit IPv4 heraus.
Das tolle an Sock_Packet ist doch das du lediglich SRC MAC Adresse 
brauchst 48 Bit also 6 Byte Länge und die Dest Mac Adresse mit ebenfalls 
48 Bit Länge um eine direkte Kommunikation zu realisieren. Jetzt folgt 
noch 2 Byte Typ im Ethernetframe und fertig ist die Grundstruktur des 
Ethernetframes. Das nächste Feld sind die Nutzdaten mit einer 
Mindestlänge von 46 Byte bis zu den üblichen 1500 Byte. Ist deine 
Nachricht die du verschicken willst kleiner als die 46 byte musst du auf 
die 46 byte Länge padden.
Aber vielleicht magst du mal deinen code schicken. Ich habe das Gefühl 
dass du den IPv4 Header selber baust was man gar nicht bräuchte. Ich 
kann mir sonst nicht erklären warum dein Wireshark IPv4 Broadcastpakete 
ausgibt wenn du nur Ethernet Frames versendest.

Autor: Andre (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Phil, Hallo Klaus

@Klaus
Alles läuft quasi Strenförmig in einem Router zusammen. Weitere Switche 
/ Hubs etc sind ncht vorhanden.

@Phil
Vielleicht hab ich mich ja etwas blöd ausgedrückt. Also ich erzeuge 
schon die jeweiligen Header (ETH + IPv4 + UDP). Das Protokoll soll 
nachher in einem Netzwerk fahren, wo nicht unbedingt jeder Teilnehmer 
eine IP besitzt. solange die Teilnehmer noch keine IP besitzen läuft 
halt die Kommunikation über die Ethernet-Adresse.

Ich bin aber mittlerweile etwas schlauer. Also ich habe jetzt Folgende 
Teilnehmer in meinem Testszenario:

PC Linux per Ethernet-Kabel an den Router
PC Linux per WLAN an den Router
Embedded Controller 32 Bit per Ethernet-Kabel an den Router
Embedded Controller 32 Bit per WLAN an den Router
Raspberry Pi per Ethernet-Kabel an den Router

Die Kommunikation über den Raw-Socket (Über IP und MAC) klappt 
einwandfrei über das kabelnetzwerk. auch mit meinen selbstgebauten 
Paketen. Liegt allerdings eine Kabellose Strecke dazwischen, gehen die 
Pakete nicht raus.

Anbei die Konfiguration der Socketeinstellungen wie ich sie verwende:


Initialisierung des Socket-Deskriptors:
  int _sockFD = 0;
  //creating the deskriptor
  _sockFD = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  if(_sockFD == -1){
    log("Socketerror", ERROR);
    return ERROR;
  }

Initialisierung der Socketstruktur:
  //Getting ID of Networking-Device
  strncpy(ifr.ifr_name, NET_DEVICE_0, sizeof(ifr.ifr_name));

  if(ioctl(_sockFD, SIOCGIFINDEX, &ifr) != 0){
      log("IOCTL-ERROR - Index", ERROR);
      return ERROR;
  }

  sock->sll_protocol  = htons(ETH_P_IP); //Used Proto
  sock->sll_ifindex  = ifr.ifr_ifindex; //Index of NW-device
  sock->sll_halen    = ETH_ALEN;     
  sock->sll_family  = AF_PACKET;     //Packet-Family


Und vor dem Versenden der eigentlichen Pakete, binde ich an das Device 
(Diese werden dynamisch ermittelt, falls mehrere vorhanden). Wird aber 
immer das richtige genutzt
  if(setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void*)&ifr, sizeof(ifr)) < 0){
    log("Can't Bind to NW-Device", PROG_ERROR);
    return SYS_ERROR;
  }

  //Setting up Broadcast-Permissions
  if(setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &on, 4) == -1){
    log("Can't set Broadcastpermission", PROG_ERROR);
    return SYS_ERROR;
  }



Verwende ich allerdings normale Sockets (oberhalb des Datalink-Layers), 
werden die Pakete ohne Probleme übers netz gesendet. Allerdings werden 
dort auch sämtliche Informationen vom Kernel ausserhalb des Userspaces 
gesetzt.

Scheinbar vertragen sich meine Raw-sockets mit der WLAN-Verbindung 
nicht. Wobei das doch eigentlich keinen Unterschied machen dürfte.

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
was soll der ganze aufwand? Wenn du normale Packete (UDP und TCP) 
verschicktn willst dann gehört auch dazu eine IP. Es macht doch 
überhaupt keinen sinn selber alles neu zu Programmieren nur weil das 
gerät noch keine Offizelle IP hat.

Jeder Windows PC schafft es sich ohne selber eine IP zu vergeben wenn er 
alleine im Netzt ist.

http://de.wikipedia.org/wiki/Zeroconf

und in 95% alles Netze ist sowiso ein DHCP Server dann braucht du nicht 
mal das. Jedes Netzwerk gerät was man kauf hat eine Feste IP über die 
man es erreichen kann.

Warum du aber alles anders machen willst, versteh ich nicht.

Autor: Andre (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Peter II

Ich arbeite zur Zeit ausschließlich in einer Unix/Windows-Umgebung.

Und die embedded-controller sollen sich nach Anschluss an ein Netzwerk 
Automatisch melden. Eine IP wird denen dann durch eine bestimmte 
Software zugewiesen, welche im Netzwerk läuft.

Dazu ist aber folgendes wichtig:

Schritt1: Controller startet im neuen Netzwerk (In dem durchaus kein 
DHCP sein kann (Im Bereich Homeautomation schon zu Hauf gesehen)

Schritt 2: Pero MAC-Broadcast und IP-Broadcast bei allen Teilnehmern 
melden (Raw-Socket nicht unbedingt benötigt)

Schritt 3: PC mit Software sendet an neuen Teilnehmer gerichtet (MAC!!) 
eine IP und ID. (Raw sockets auf Layer 2 unverzichtbar).

Schritt 4: Teilnehmer stellt sich neu ein

Das klappt auch alles. nur halt nicht mit einer WLAN-Strecke. Und darum 
geht es mir auch. Nicht um die sinnhaftigkeit des Aufbaus :)

Autor: Andre (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Entschuldige, ich meinte natürlich ausschließlich unter Unix!

Autor: Klaus Wachtler (mfgkw)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das, was du als Router bezeichnest, ist nebenbei auch ein Switch unf 
eine Bridge.

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Andre schrieb:
> Dazu ist aber folgendes wichtig:
>
> Schritt1: Controller startet im neuen Netzwerk (In dem durchaus kein
> DHCP sein kann (Im Bereich Homeautomation schon zu Hauf gesehen)

> Schritt 2: Pero MAC-Broadcast und IP-Broadcast bei allen Teilnehmern
> melden (Raw-Socket nicht unbedingt benötigt)
>
> Schritt 3: PC mit Software sendet an neuen Teilnehmer gerichtet (MAC!!)
> eine IP und ID. (Raw sockets auf Layer 2 unverzichtbar).

> Schritt 4: Teilnehmer stellt sich neu ein
> Das klappt auch alles. nur halt nicht mit einer WLAN-Strecke. Und darum

> geht es mir auch. Nicht um die sinnhaftigkeit des Aufbaus :)

und was ist wenn du mal ein richtiges netwerk mit Routern vorfindest, 
eventuell noch Firewalls? Das ganze ist doch schon wieder nur auf ein 
Netzsegment begrenzt.

Warum simuliert deine Software nicht einen DHCP-Server der nur antwortet 
wenn die anfrage von dem MAC Bereich deiner Gerät kommt (und kein andere 
DHCP server vorhanden ist). Dann kommt man komplett ohne Raw socket aus. 
Entweder bekommt dein Gerät die IP vom offizellen DHCP oder von deinem.

Und das du nur untern Unix arbeitest, heist ja nicht das du nicht 
offizelle RFC umsetzen darst.

Autor: Robert L. (lrlr)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
>Warum simuliert deine Software nicht einen DHCP-Server der nur antwortet
>wenn die anfrage von dem MAC Bereich deiner Gerät kommt (und kein andere
>DHCP server vorhanden ist). Dann kommt man komplett ohne Raw socket aus.

interessant,
mit was (wenn nicht Raw socket) arbeitete dieser "simmulierte" 
DHCP-Server dann??



zum Thema: die Meisten/Alle Sysadmins werden es nicht gerne sehen, wenn 
man sowas wie der TO vor hat "aufführt", deshalb sollte man das einfach 
so machen, wie es alle machen...

Autor: Peter II (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Robert L. schrieb:
> interessant,
> mit was (wenn nicht Raw socket) arbeitete dieser "simmulierte"
> DHCP-Server dann??

UDP

http://de.wikipedia.org/wiki/Dynamic_Host_Configur...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net