[Python-de] UDP Socket-Programmierung und "falsche" IP-Adressen

Arnold Krille arnold at arnoldarts.de
Di Aug 6 20:25:47 CEST 2013


Hi,

On Tue, 06 Aug 2013 09:01:22 +0200 helge at nicht-laut.de wrote:
> Am 05.08.2013 16:45, schrieb Sebastian Wiesner:
> > Am 5. August 2013 14:54 schrieb  <helge at nicht-laut.de>:
> >> Ich möchte aber auch die Messages erhalten, die von Geräten
> >> stammen, die nicht im gleichen Subnetz hängen, bzw. mit der 
> >> IP-Adresse
> >> 0.0.0.0 an die Broadcast-Domäne (255.255.255.255) senden. Ich sehe 
> >> die
> >> Pakete via wireshark aber sie werden nicht im Script verarbeitet.
> >
> > Du musst an INADDR_BROADCAST binden und die Socket-Option 
> > SO_BROADCAST
> > setzen, um unter Linux Broadcast-Pakete empfangen zu können.
> >
> > Deine Anforderungen beißen sich.  Mag sein, dass ich Dich falsch
> > verstanden habe, doch in jedem Fall kannst Du mit 255.255.255.255
> > nicht über Subnetz-Grenzen hinweg senden.  Im Gegenteil, Pakete mit
> > dieser Address bleiben *immer* im lokalen Subnetz, sprich, sie
> > werden von keinem Router weitergeleitet.
> 
> ich glaube, dass ich mich hier vielleicht missverständlich
> ausgedrückt habe.
> Die Pakete sollen auch nie die eigene Broadcast-Domäne (Switch,
> Layer2) verlassen. Die werden natürlich nicht geroutet. Aber das
> sollen sie auch garnicht. Ich möchte nur ein Paket von 0.0.0.0/0 ->
> 255.255.255.255 (FF:FF:FF:FF:FF) an der Linux-Kiste entgegennehmen.
> Ich habe es probiert mit:
> cs = socket(AF_INET, SOCK_DGRAM)
> cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
> cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
> cs.settimeout(1)
> cs.bind(('255.255.255.255',UDP_GET_PORT))

So hab ich in einem altem Prjekt von mir erfolgreich Broadcasts
entgegen genommen:

  self.sock = socket(AF_INET,SOCK_DGRAM)
  self.sock.setsockopt(SOL_SOCKET,SO_BROADCAST,True)
  self.sock.bind(("",cloudknowledgeport))

Man muss die broadcast-Option setzen und sich an alle (oder einzelne)
der lokalen Adressen/Interfaces hängen. Ein bind auf die
Broadcast-Adresse sollte afaik nichts oder nur Fehler liefern. Denn die
Broadcast-Adresse, speziell die Globale, ist ja gar keine richtige
Adresse. Auf jeden Fall ist es keine lokale Adresse Deines Computers.

Achja, viel Spaß wenn Du Deiner Software dann IPv6 beibringst.
Vielleicht fängst Du auch unter IPv4 lieber mit multicasts an und lässt
das mit den broadcasts?

Bis denn,

Arnold
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 198 bytes
Beschreibung: nicht verfügbar
URL         : <http://mail.python.org/pipermail/python-de/attachments/20130806/3f627243/attachment.pgp>


Mehr Informationen über die Mailingliste python-de