Broadcasts: Senden geht, empfangen nicht

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

Hallo,
ich habe hier ein kleines Beispielscript für einen Server, der auf einem UDP-Port nach Paketen lauscht. Ein kleiner Client soll nen Broadcast herumschicken. Wenn der Server den Broadcast empfängt, soll er ein Paket an den Client zurückschicken, das dieser dann weiterverarbeitet. Ich bin bis jetzt so weit das der Server den Broadcast empfängt und auch die übermittelten Daten ausgibt, aber das Paket das er an den Client zurückschickt kommt dort nicht an. Ich bin mir nicht sicher wo's hakt, kann mit evtl. jemand helfen?


server.py

Code: Alles auswählen

import socket

host = ""
port = 50000
version = "0.1"

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.bind((host, port))

while 1:
	try:
		msg, addr = s.recvfrom(8192)
		print "Client version " + msg + " at " + addr[0]
		s.sendto(version, addr)
	except:
		break
client.py

Code: Alles auswählen

import socket, sys, time

host = "<broadcast>"
port = 50000
version = "0.1"

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.connect((host, port))
s.sendall(version)
s.shutdown(1)

while 1:
    msg, addr = s.recvfrom(2048)
    print "Server version: " + msg
Edit (Leonidas): Highlighting aktiviert.
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Ich hab zwar noch nie was mit Sockets in Python gemacht, aber ich versuchs mal wieder :)

Bist du dir beim s.shutdown(1) im Client ganz sicher was du da machst?

Auszug aus der Doku:
shutdown( how)
Shut down one or both halves of the connection. If how is SHUT_RD, further receives are disallowed. If how is SHUT_WR, further sends are disallowed. If how is SHUT_RDWR, further sends and receives are disallowed.

how sollte also entweder SHUT_RD, SHUT_WR oder SHUTRDWR haben, bei dir hats 1. Hoffentlich stimmt das.

Ich weiß nicht warum ich die Verbindung beenden sollte wenn ich noch was mepfangen will, aber vielleicht stimmts ja so wie du es machst und SHUT_WR == 1

lgherby

p.s. sry, sitzt grad auf nem windowspc ohne python sonst hätt ichs ausprobiert.
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

Bin grad nicht sicher, aber ich hab das shutdown glaub ich sogar schonmal auskommentiert und es ging trotzdem nicht. Hab den Code so direkt aus einem UDP-Beispiel genommen das ich gefunden habe und nur minimal verändert. Ich probiers nochmal ...
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

Hmm, also ich habe für shutdown jetzt mal alle drei Argumente SHUT_RD, SHUT_WR usw. probiert und es auch mal ganz weggelassen - es funktioniert einfach nicht. Der Server empfängt zwar die Nachricht vom Client, aber die Kommunikation in umgekehrter Richtung klappt leider nicht. Ich bin mir nur nicht sicher ob der Fehler darin liegt das der Client nichts empfangen kann oder daran das der Server nichts sendet ...
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Warum kontrollierst du das nicht mit Netzwerktools wie z.b. Wireshark oder tcpdump? Wenn es was grafischen sein soll kann ich Wireshark empfehlen. Ist ein "Sniffer". Kann alle Pakete die an der Netzwerkkarte ankommen ( auch die die eigentlich nicht für den Rechner bestimmt waren ) anzeigen.

Nebenbei probier ich dein Script einmal. Sitz grad wieder auf meinem Rechner. Aber vielleicht bist du ja mit Wireshark schneller :)

lgherby
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Vielleicht solltest du mal das blinde except-Statement weglassen oder auf bestimmte, dir bekannte Exceptions beschränken, denn so entgeht dir einiges.

Übrigens ist ``while True:`` schöner und deutlicher :)
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

OK, hab jetzt das gesamte try...except rausgenommen, aber es tut sich immer noch nichts. Werd nochmal nach einem Codebeispiel suchen, ich weiß echt nich mehr weiter.
Antworten