Hallo
Ich habe folgendes Problem:
Ich verwende recfrom() um UDP Daten zu empfangen.
Ein Server sendet mehrere UDP Packete mit je 104bytes an Länge, diese möchte ich mit einem Python Programm empfangen.
Mit Wireshark sehe ich die einzelnen Datagramme mit der Länge von 104bytes.
Die funktion recvfrom liefert mir allerdings oft(nicht immer) Daten mit der Länge von 1404 bytes und ich habe festgestellt, dass sich in diesen Daten 13Stück der 104byte datagramme auf einmal befinden.
Scheinbar werden irgendwo mehrere Datagramme zusammengefasst und recvfrom liefert dadurch mehrere Datagramme in einem Aufruf.
Wie kann ich das unterbinden, ich möchte gerne pro recvfrom Aufruf nur 1 Datagram erhalten.
Kann ich dazu den Socket irgendwie konfigurieren?
mfg
Sektionschef
Empfange mehrere Datagramme mit recvfrom
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Willkommen im Forum!
Nein, was du haben willst geht nicht. `socket.recv` & co empfangen _bis zu_ `bufsize` Daten. Soll heissen, wenn du `bufsize` auf deine Datagram laenge beschraenkst _koenntest_ du _eventuell_ nur ein Datagram bekommen, aber es muss dann auch nicht vollstaendig sein.
Lies die Daten mit einer vernuenftigen `bufsize` und zerlege dann deine Daten in die einzelnen Datagramme.
Nein, was du haben willst geht nicht. `socket.recv` & co empfangen _bis zu_ `bufsize` Daten. Soll heissen, wenn du `bufsize` auf deine Datagram laenge beschraenkst _koenntest_ du _eventuell_ nur ein Datagram bekommen, aber es muss dann auch nicht vollstaendig sein.
Lies die Daten mit einer vernuenftigen `bufsize` und zerlege dann deine Daten in die einzelnen Datagramme.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 5
- Registriert: Freitag 3. Juli 2015, 11:54
Danke, nur wenn die Datagramme unterschiedlich lang sind, wie weiß ich wo im buffer das nächste Datagram liegt?cofi hat geschrieben: Lies die Daten mit einer vernuenftigen `bufsize` und zerlege dann deine Daten in die einzelnen Datagramme.
mfg
Sektionschef
-
- User
- Beiträge: 5
- Registriert: Freitag 3. Juli 2015, 11:54
Hallo
Obwohl nur UDP Packete mit 104byte länge versendet werden, und die zeigt Wireshark auch korrekt an, erhalte ich in d[0] den Wert 1404 (=13x104) und in rcv erhalte ich 13 Datagramme hintereinander.
mfg
Sektionschef
Code: Alles auswählen
try :
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print 'Socket created'
except socket.error, msg :
print 'Failed to create socket. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
sys.exit()
# Bind socket to local host and port
try:
s.bind((ownHOST, ownPORT))
except socket.error , msg:
print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message: ' + msg[1]
sys.exit()
print 'Socket bind complete'
rcv = bytearray(1500)
s.settimeout(1)
...
while i < NUM_SWC_APH
d = s.recvfrom_into( rcv,1500)
...
mfg
Sektionschef
-
- User
- Beiträge: 5
- Registriert: Freitag 3. Juli 2015, 11:54
Ich kann leider nur das Empfangsprogramm posten, da der Sender eine Hardware ist, die mittels embedded code diese UDP-Pakete versendet.
Wie es aussieht dürfte der Fall, wo mehrere Datagramme in den Buffer geschrieben werden zeitabhängig sein, also wenn die Pakete sehr schnell hintereinander versendet werden, dürften sie im Buffer hintereinander abgelegt werden.
mfg
Sektionschef
Wie es aussieht dürfte der Fall, wo mehrere Datagramme in den Buffer geschrieben werden zeitabhängig sein, also wenn die Pakete sehr schnell hintereinander versendet werden, dürften sie im Buffer hintereinander abgelegt werden.
mfg
Sektionschef
@Sektionschef: ich habe die Pakete gesendet und zeitverzögert gelesen und um die halbe Welt geschickt und nie sind die einzelnen Pakete zusammengeklumpt. Das ist bei diesem Netzwerkprotokoll auch gar nicht möglich. Du mußt also irgendwo eine Middle-Ware haben, die böse nicht protokollspezifische Dinge macht.
-
- User
- Beiträge: 5
- Registriert: Freitag 3. Juli 2015, 11:54
Sirius3, vielen Dank für deine Untersuchungen und Bemühungen.
Mein client programm läuft auf einem normalen Windows7 PC, die Pakete kommen per Ethernet von der externen Hardware.
Ich nehme mal an der Wireshark, der am gleichen PC läuft, zeigt die Pakete richtig an. Theoretisch könnte es ja auch sein, dass die Pakete ja schon von der Hardware zusammengefasst werden und wireshark zeigt sie einzeln an...kann aber nicht sein.
mfg
Sektionschef
Mein client programm läuft auf einem normalen Windows7 PC, die Pakete kommen per Ethernet von der externen Hardware.
Ich nehme mal an der Wireshark, der am gleichen PC läuft, zeigt die Pakete richtig an. Theoretisch könnte es ja auch sein, dass die Pakete ja schon von der Hardware zusammengefasst werden und wireshark zeigt sie einzeln an...kann aber nicht sein.
mfg
Sektionschef