Seite 1 von 2

Problem mit UDP via Socket

Verfasst: Montag 4. August 2014, 14:28
von seum
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.

Re: Problem mit UDP via Socket

Verfasst: Montag 4. August 2014, 16:29
von 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?

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 08:04
von seum
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''

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 08:22
von 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.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 09:19
von seum
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 :)

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 09:22
von 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.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 12:44
von seum
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.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 12:48
von 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.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 13:48
von seum
@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

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 14:02
von BlackJack
@seum: Moment: Beim `bind()` muss IP/Interface und Port des *Empfängers* angegeben werden, laut Wireshark hast Du da die des *Senders* angegeben.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 14:17
von seum
@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.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 14:26
von BlackJack
@seum: Im Wireshark steht aber 50367 als Zielport.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 14:38
von seum
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 ?

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 15:00
von BlackJack
@seum: Dann änder das ``data`` mal in ``len(data)``, dann müsste Dir ja mindestens die Länge ausgegeben werden.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 15:10
von seum
Auch das habe ich schon versucht ;(
Mir kommt das so vor als würde er hier hängen: data, addr = sock.recvfrom(1024)

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 15:25
von 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.

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 16:00
von seum
Kann es sein das der Datentyp nicht stimmt? Das Print den nicht ausgeben kann?

Re: Problem mit UDP via Socket

Verfasst: Dienstag 5. August 2014, 16:04
von EyDu
Nein, das kann nicht sein. Das sind ja einfach nur Bytes.

Re: Problem mit UDP via Socket

Verfasst: Mittwoch 6. August 2014, 11:34
von seum
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.

Re: Problem mit UDP via Socket

Verfasst: Mittwoch 6. August 2014, 12:50
von BlackJack
@seum: *Von* welchem Port die Gegenstelle sendet ist doch völlig egal solange sie immer *an* den selben Port sendet.