UDP Broadcast

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Capy
User
Beiträge: 1
Registriert: Dienstag 31. Oktober 2017, 16:46

Hallo Leute,
ich würde gerne mit Hilfe eines UDP Broadcast die Adressen aller Geräte in einem Netzwerk herausfinden.
Als Beispiel: Ich sende eine Nachricht, z.B. "Ping" an jedes Gerät im Netzwerk und ich will dann, dass diese Geräte mir mit ihrer IP-Adresse antworten.

Durch einige Tutorials und Guides bin ich jetzt soweit gekommen:

Code: Alles auswählen

from socket import *
import time
import threading

port = 5002

class PingerThread(threading.Thread):
def __init__(self):
    threading.Thread.__init__(self)

def run(self):
    print('start thread')
    s = socket(AF_INET, SOCK_DGRAM)
    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
    time.sleep(0.1)
    s.sendto('Ping'.encode('utf-8'), ("255.255.255.255", port))


a = PingerThread()
a.start()

try:
    s = socket(AF_INET, SOCK_DGRAM)
    s.bind(('', port)
except:
    print('failed to bind')
    s.close()
    raise
    s.blocking(0)

data = s.recvfrom(1024)
print(data)
s.close()

if __name__ == "__main__":
    PingerThread().run()
Wenn ich den Code ausführe mit s.sendto('Ping'.encode('utf-8'), ("255.255.255.255", port)) bekomme ich nur die IP meines Routers zurück, wenn ich statt der 255.255.255.255 Adresse, die von meinem Router verwende, also 192.168.173.255, dann bekomme ich nur die IP meines Rechners zurück.

Die Frage die ich mir jetzt stelle ist ob der Code richtig ist und das Problem eher an meinem Router und den Freigaben liegt oder ob der Code falsch ist.

Danke schonmal im Voraus :=)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich bin mir ziemlich sicher das das so nicht geht. Broadcasts brauchen immer noch einen laufenden Server, da kommen nicht einfach magisch alle Clients zurück.

Ich habe persönlich nich nicht damit experimentiert, aber IMHO geht das über ARP. Denn eiinerhalb eines Netzwerksegmentes solltest du eigentlich alles Macadressen der angeschlossenen Geräte sehen, und die wiederum zu IPs auflösen können.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Capy hat geschrieben:Hallo Leute,
ich würde gerne mit Hilfe eines UDP Broadcast die Adressen aller Geräte in einem Netzwerk herausfinden.
Als Beispiel: Ich sende eine Nachricht, z.B. "Ping" an jedes Gerät im Netzwerk und ich will dann, dass diese Geräte mir mit ihrer IP-Adresse antworten.
Nur zum Verständnis: Möchtest du wissen, welche Adressen vergeben sind? Oder möchtest du auch eine Zuordnung von Hostname + IP-Adresse (u.o. MAC) ?

Wie dem auch sei - ICMP-Broadcasts werden bspw. nicht auf Linux-Hosts erlaubt, was wohl einem "Security-Feature" geschuldet ist, eventuell liegt also hier bereits dein Problem, dass reine ICMP-Broadcasts gar nicht funktionieren können.

Unter Linux kann man IPv4-Broadcasts mit folgendem Kommando erlauben:

(Geht nur als root)

Code: Alles auswählen

echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
192.168.5.195 ist in diesem Beispiel ein Linux-Host der auf den Broadcast antwortet:

Code: Alles auswählen

ping -b 255.255.255.255
WARNING: pinging broadcast address
PING 255.255.255.255 (255.255.255.255) 56(84) bytes of data.
64 bytes from 192.168.5.200: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 192.168.5.195: icmp_seq=1 ttl=64 time=0.440 ms (DUP!)
64 bytes from 192.168.5.200: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 192.168.5.195: icmp_seq=2 ttl=64 time=0.457 ms (DUP!)
Edit: da du auf dem Transport-Layer herumwerkst noch als Ergänzung - der Host der den Broadcast absendet muss einen Fuß in jedes Subnetz haben, sonst kann der Broadcast nicht funktionieren.
When we say computer, we mean the electronic computer.
Antworten