Broadcast ins Netzwerk?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
lunar

Hallo Forum,

ich versuche gerade ein kleines Chatprogramm fürs lokale Netz zu implementieren. Das Ganze soll auf UDP basieren. Gerade spiele ich noch mit den Möglichkeiten der Python Bibliothek. Bis jetzt hat alles geklappt, nur eins bereitet mir Kopfzerbrechen:

Ich möchte beim Start des Programmes halt eine Liste aller gerade verfügbaren Rechner (mit laufendem Chatprogramm) anzeigen, aus welcher der User dann nur noch den richtigen auswählen muss. Wie erhalte ich also eine Liste aller Rechner im lokalen Netz?

Der Server sieht dabei in etwa so aus:

Code: Alles auswählen

from SocketServer import UDPServer, BaseRequestHandler

class Handler(BaseRequestHandler):
    def handle(self):
         print 'received:', self.request, 'from', self.client_address

addr = ('192.168.2.24', 5555)

print 'listening on %s:%s' % addr
server = UDPServer(addr, Handler)
server.serve_forever()
Ich habe versucht, Pakete an die Broadcast Adresse 255.255.255.255 zu senden:

Code: Alles auswählen

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)  
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True) 
s.sendto('hallo', ('255.255.255.255', 5555)
s.close()
Allerdings scheint der UDP Server auf der Gegenseite diese zu ignorieren, d.h. er zeigt auf ein solches Paket keinerlei Ausgabe.

Welche Möglichkeiten gibt es noch, bzw. was mache ich falsch?
Ach ja, ich sollte noch hinzufügen, dass ich von Netzwerkprogrammierung wenig bis gar keine Ahnung habe :oops:

Danke
lunar
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

lunar hat geschrieben:Allerdings scheint der UDP Server auf der Gegenseite diese zu ignorieren, d.h. er zeigt auf ein solches Paket keinerlei Ausgabe.
Hi lunar!

Du hast einfach nur die falsche Broadcast-Adresse angegeben.

Code: Alles auswählen

s.sendto('hallo', ('192.168.2.255', 5555))
Diese hängt meist von der Netzwerkmaske ab. Wahrscheinlich hast du die Maske "255.255.255.0" gesetzt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

gerold hat geschrieben: Du hast einfach nur die falsche Broadcast-Adresse angegeben.

Code: Alles auswählen

s.sendto('hallo', ('192.168.2.255', 5555))
Diese hängt meist von der Netzwerkmaske ab. Wahrscheinlich hast du die Maske "255.255.255.0" gesetzt.
Mmmh, also 255.255.255.255 ist doch eigentlich die "Universal"-Broadcast Adresse für Pakete ins eigene LAN, oder? Zumindest habe ich das so verstanden, aber - wie gesagt - ich habe nicht so wirklich viel Ahnung von Netzwerkprogrammierung...

Anyway, ich probiere das morgen Nachmittag mal aus. Jetzt ist's schon ein bisschen spät...
lunar

Mmmh, sehr strange :?

Ich habe deinen Tipp mal befolgt und das Paket an 192.168.2.255 gesendet. Trotzdem wird es von Server nicht bemerkt. Das Paket wird definitiv gesendet, ich habe den Traffic mit wireshark "gesnifft".

Das ganze scheint auch kein generelles Problem zu sein, da andere UDP Broadcasts wunderbar funktionieren. Getestet habe ich das mittels "nmblookup". Damit wird ein Broadcast zur NETBios Namensauflösung gesendet.

Ich habe das Gefühl, dass das am Server liegt. Muss ich dem Server vielleicht irgendeine spezielle Option mit auf den Weg geben? Oder liegt der Fehler doch beim Code fürs Senden? Ich bin ratlos :(

Danke für eure Hilfe
lunar
lunar

Ah, ich hab das Problem gelöst :D

Mein Fehler war, dass der Server explizit auf '192.168.2.24' gelauscht hat. Offenbar werden dadurch Broadcasts ignoriert. Erzeugt man den Server dagegen mit folgendem Code,

Code: Alles auswählen

addr = ('', 5555) # '' steht für INADDR_ANY
server = UDPServer(addr, Handler)
dann werden auch Broadcast Pakete erkannt.
Man sollte die Dokumentation eben genauer lesen :oops:

Gruß
lunar
Benutzeravatar
Blattlaus
User
Beiträge: 55
Registriert: Donnerstag 24. August 2006, 08:55

Nichts desto trotz hängt die Korrekte Broadcast-Adresse von IP und Subnetzmaske ab. Die BC-Adresse kann 192.168.11.255 sind, aber genau so gut 10.255.255.255 oder 192.168.99.128.

Eine entsprechende erkennung musst du implementieren ;)
lunar

Blattlaus hat geschrieben:Nichts desto trotz hängt die Korrekte Broadcast-Adresse von IP und Subnetzmaske ab.
Ja, das bestreite ich ja auch gar nicht...

Mein Problem war nicht, dass ich die falsche BC Adresse genommen habe, sondern dass der Server trotz korrekter BC-Adresse beim Senden keine BC Paket empfangen hat...
Blattlaus hat geschrieben:Die BC-Adresse kann 192.168.11.255 sind, aber genau so gut 10.255.255.255 oder 192.168.99.128.
Eine entsprechende erkennung musst du implementieren ;)
Da komme ich nicht mit... :oops:

Beim Server muss ich doch überhaupt nichts erkennen. Es reicht mir, wenn ich Broadcast Pakete empfange, was beim ersten Versuch nicht der Fall war...
Ob Paket nun an die Broadcast Adresse oder direkt an meine IP gerichtet war, ist für meine Zwecke völlig egal. Wichtig ist für mich nur der Inhalt des Pakets und die Quell-IP. Mehr nicht...

Beim Senden reicht es, wenn man statt einer IP den String "<broadcast>" angibt. Dann geht das Paket an die Broadcast-Adresse.

Wo muss ich da jetzt was erkennen?

Tia
lunar
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

lunar hat geschrieben:Da komme ich nicht mit...
Hi lunar!

- Start --> Ausführen --> cmd
- IPCONFIG

Poste hier doch mal die Ausgabe von ``ipconfig``.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

gerold hat geschrieben:
lunar hat geschrieben:Da komme ich nicht mit...
- Start --> Ausführen --> cmd
- IPCONFIG

Poste hier doch mal die Ausgabe von ``ipconfig``.
Unmöglich, da Linux User ;)

Deshalb:

Code: Alles auswählen

[lunar@nargond]-[15:00:31] >> ~
--> ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:07:e9:55:31:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.24/24 brd 192.168.2.255 scope global eth0
    inet6 fe80::207:e9ff:fe55:313c/64 scope link
       valid_lft forever preferred_lft forever
Meine Broadcast Adresse lautet folglich 192.168.2.255.

Aber wo ist denn eigentlich das Problem. Es geht doch jetzt :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Lunar!
lunar hat geschrieben:Unmöglich, da Linux User ;)
Sehr positiv! :-)
lunar hat geschrieben:Meine Broadcast Adresse lautet folglich 192.168.2.255.
Aber wo ist denn eigentlich das Problem. Es geht doch jetzt :)
Das Problem ist, dass du mein Verständnis von Broadcast durcheinander geworfen hast.
Wenn der Server auf ``192.168.2.24`` horcht, dann müsste er die Signale, die der Client an ``192.168.2.255`` sowie an ``255.255.255.255`` sendet, abfangen können.

Bei dir hat das aber anscheinend nicht funktioniert. Erst als du den Server auf ```` umgestellt hast. Das ist es, was ich nicht kapiere.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten