Empfange mehrere Datagramme mit recvfrom

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Sektionschef
User
Beiträge: 5
Registriert: Freitag 3. Juli 2015, 11:54

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
Benutzeravatar
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.
Sektionschef
User
Beiträge: 5
Registriert: Freitag 3. Juli 2015, 11:54

cofi hat geschrieben: Lies die Daten mit einer vernuenftigen `bufsize` und zerlege dann deine Daten in die einzelnen Datagramme.
Danke, nur wenn die Datagramme unterschiedlich lang sind, wie weiß ich wo im buffer das nächste Datagram liegt?
mfg
Sektionschef
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sektionschef: seltsam, dass recfrom mehr als ein Datenpaket auf einmal liefert. Kannst Du Deinen Code mal zeigen?
Sektionschef
User
Beiträge: 5
Registriert: Freitag 3. Juli 2015, 11:54

Hallo

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)
...
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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sektionschef: ich kann das Problem immer noch nicht reproduzieren. Kannst Du zwei lauffähige Programme Sender und Empfänger posten, die das Problem zeigen.
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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Sektionschef
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
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sektionschef: hast Du irgendwelche kaputten Firewalls installiert oder sonstige Programme, die den Netzwerkverkehr beeinflussen?
Antworten