Problem mit UDP via Socket

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

Hallo Liebe Python Freunde.

Ich bin Python Neuling. Arbeite mit Python 3.41.
Derzeit versuche ich via UDP Daten einzulesen.

Hier mein Code:

Code: Alles auswählen

import socket
import sys

ip = "192.168.1.2"  #IP meines Rechners
port = 3020  #Port auf dem die Daten kommen

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  #UDP

sock.bind((ip, port))  #UDP

while True:

	data, addr = sock.recvfrom(1024)  # Buffer groeße ist 1024 bytes
	print("Meine Daten: ", data) # Daten ausgeben
Die Daten (Zahlen und Zeichen) bekomme ich von einem Linux Rechner. Wenn ich via netcat ein "Hallo Welt" oder ähnliches schicke, funzt das, aber meine Zahlen und Zeichen werden mir nicht angezeigt! Ankommen tun diese aber an meinen Rechner auf Port 3020, das zeigt mir Wireshark. Bei den Zahlen und Zeichen handelt es sich um Messdaten.

Vielen Dank für eure Hilfe.
BlackJack

@seum: Wird *gar* nichts ausgegeben? Oder nur der Inhalt von `data` nicht? Siehst Du etwas wenn Du ``ascii(data)`` ausgeben lässt?

Edit: Bist Du sicher das die Messdaten per UDP verschickt werden?
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

Hallo BlackJack,

danke für deine schnelle Antwort.

Ja die Daten werden sicher via UDP gesendet. Ich habe mir das selbe Programm in VB für Windows geschrieben da funzt es auch.

Ein: print("meine daten: ", ascii(data)) hat leider nichts geholfen.

Die Ausgabe bleibt leer. Nicht mal "meine daten: " kommt. Kann es sein, dass der String als Byte gesendet wird? Kann Python das umwandeln (byte to string).

Wenn ich den Buffer auf 0 setze arbeitet die Schleife. Dann kommt: Meine Daten: b''
BlackJack

Wenn Du dem Programm via ``netcat`` Daten schicken kannst, die Messdaten aber nicht ankommen, dann muss es da ja irgend einen Unterschied geben. Den musst Du jetzt nur noch heraus finden. :-) Vergleich doch mal Wireshark-Protokolle auf dem empfangenden Rechner bezüglich der beiden Arten zu senden, also ``netcat`` und Messdaten, miteinander.

So viel kann es ja nicht mehr sein. Wenn UDP sicher ist, dann bleiben ja nur noch Interface (IP), Port, und eventuell eine Firewall.
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

Hallo,

hab jetzt die beiden Protokolle verglichen. Leider kein Unterschied. IP, Port sind richtig. Die Firewall ist aus. Kann die Datenmenge ein Problem sein? Einmal sind es 139 Bytes und einmal 93 Bytes. Sollte ja nicht sonderlich viel sein :)
BlackJack

@seum: Nein diese Daten”menge” ist sicher kein Problem. ;-)

Ich denke dann kann man ohne weitere Informationen nichts mehr sagen. Das ist vorsichtig ausgedrückt sehr merkwürdig.
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

Hallo,

ich verstehe es auch nicht ganz:( Welche Informationen könnten noch hilfreich sein?

Hab jetzt im Internet auch schon was gesehen, das print keine Bytes ausgeben kann.
BlackJack

@seum: Tatsächliche Daten könnten hilfreich sein. Du könntest auch mal '0.0.0.0' oder '' (leere Zeichenkette) als IP beim `bind()` verwenden damit auf allen Interfaces gelauscht wird.
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

@BlackJack das habe ich alles schon versucht. Evtl. liegt der Fehler auch an der Gegenseite. Mit meinem kleinen Programm kann ich ja via UDP Daten empfangen die ich mit NC oder einem anderen Python Programm verschickt habe. Komisch ist nur das ich via Wireshark die Messdaten sehe. Via UDP an meiner Ip und meinem Port.

Edit: anbei noch ein Bild von wireshark

Bild
BlackJack

@seum: Moment: Beim `bind()` muss IP/Interface und Port des *Empfängers* angegeben werden, laut Wireshark hast Du da die des *Senders* angegeben.
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

@BlackJack der Programm Code oben ist nicht mehr ganz richtig. Die Ip im Code lautet jetzt 192.168.1.45 und der Port wie gehabt 3020.
BlackJack

@seum: Im Wireshark steht aber 50367 als Zielport.
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

Auch auf diesem Port bekomme ich nichts ausgegeben. Wenn ich den Buffer auf z.B. 24 setzte, kommt die Fehlermeldung, das der Buffer für die Nachricht zu klein ist oder die Nachricht zu groß für den Buffer :) Dann würden ja Daten kommen? Er gibt sie nur nicht aus? Kann man sich bei Python den Inhalt der Variable anzeigen lassen so wie bei PHP z.B. mit print_r ?
BlackJack

@seum: Dann änder das ``data`` mal in ``len(data)``, dann müsste Dir ja mindestens die Länge ausgegeben werden.
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

Auch das habe ich schon versucht ;(
Mir kommt das so vor als würde er hier hängen: data, addr = sock.recvfrom(1024)
BlackJack

@seum: Wenn bei einem zu kleinen Puffer eine Ausnahme kommt, dann muss doch bei einem ausreichend grossen Puffer auch das Datenpaket ankommen. Ansonsten wüsste ich da echt nicht woran das liegen kann.
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

Kann es sein das der Datentyp nicht stimmt? Das Print den nicht ausgeben kann?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Nein, das kann nicht sein. Das sind ja einfach nur Bytes.
Das Leben ist wie ein Tennisball.
seum
User
Beiträge: 13
Registriert: Montag 4. August 2014, 14:11

Hallo,

es geht jetzt. Warum? Die Gegenstelle sendet nach jedem Neustart auf einem anderen Port. Warum das so ist, muss ich mir jetzt dann noch anschauen. Die Gegenstelle ist eine SPS die mit Codesys Programmiert ist. Da muss ich mir die UDP Library mal anschauen.

Aber vielen Dank für eure Hilfe.
BlackJack

@seum: *Von* welchem Port die Gegenstelle sendet ist doch völlig egal solange sie immer *an* den selben Port sendet.
Antworten