Winsock UDP (Empfangs-) Puffer vergrößern

26/02/2014 - 12:55 von garelli75 | Report spam
Hallo Gemeinde,

ich hoffe ich bin mit meinem Problemchen hier an der richtigen Stelle?!

Die Aufgabe ist von einem (embedded) Geràt die via GigE an einen Win7 PC übertragenen Daten zu empfangen.
Alle 60ms wird ein Burst von 180 UDP Pakten mit jeweils 8KB Payload übertragen. Innerhalb eines jeden Burst werden die 8KB UDP Pakete im Abstand von 83.3µs verschickt.
Daraus làsst sich also eine ungefàhre Peak Übertragungsrate von ca. 750Mbps, und ca. 187.5Mbps im Mittel ableiten.

Mit Wireshark habe ich gewissenhaft kontrolliert, dass alle UDP Pakete vollstàndig und fehlerfrei übertragen werden!

Im ersten Schritt wàre nun die Aufgabe mittels Winsock(2) zunàchst nur die Daten in einem (user mode) Buffer wegzuschreiben. Das allein schon schlàgt allerdings mit dieser grandiosen winsock ziemlich fehl, so ungefàhr jedes vierte Paket geht verloren.

Ich erzeuge mir einen socket mit SOCK_DGRAM und IPPROTO_UDP.
Zunàchst habe ich den naheliegenden Versuch unternommen den Empfangspuffer zu vergrößern. Dazu habe ich setsockopt mit SO_RCVBUF und diversen Größen für den (receive) buffer ausprobiert. Ich kontorlliere mittels getsockopt ob der Wert auch tatsàchlich übernommen wurde. Aber egal welche Größe ich setzte, diese Einstellung scheint überhaupt keinen Einfluss zu haben, es geht nach wie vor jedes vierte Paket verloren. Durch den setsockopt Aufruf scheint nicht mal Memory alloziert zu werden.

Ich habe so ziemlich jedes Programmiermodel, welches Winsock so zu bieten hat ausprobiert: von polling mittels recv über overlapped I/O mit completion (callback) routines. Ich habe auch versucht WSARecv mit mehreren buffern zu versorgen und als letzten Versuch sogar das completion ports Model und overlapped I/O mit multi-threading ausprobiert. Alles ohne Erfolg, nach wievor geht ca. jedes vierte UDP Packet verloren.

Es erhàrtet sich für mich der Verdacht, das winsock im datagram socket mode, zumindest für UDP kein vernünftiges Puffer Handling unterstützt.

Irgendjemand hier Erfahrungen mit dem winsock Empfangspuffer(n) für UDP?

Vielen herzlichen Dank schon mal!
 

Lesen sie die antworten

#1 Edzard Egberts
26/02/2014 - 13:25 | Warnen spam
schrieb:
Es erhàrtet sich für mich der Verdacht, das winsock im datagram
socket mode, zumindest für UDP kein vernünftiges Puffer Handling
unterstützt.



Wikipedia: "UDP ist ein verbindungsloses, nicht-zuverlàssiges und
ungesichertes wie auch ungeschütztes Übertragungsprotokoll. Das
bedeutet, es gibt keine Garantie, dass ein einmal gesendetes Paket auch
ankommt, dass Pakete in der gleichen Reihenfolge ankommen, in der sie
gesendet wurden, oder dass ein Paket nur einmal beim Empfànger eintrifft."

Ich habe den Verdacht, dass UDP für Deine Anwendung nicht geeignet ist.

Irgendjemand hier Erfahrungen mit dem winsock Empfangspuffer(n)
für UDP?



int Num= recvfrom(m_Server, mp_Buf, c_Buflen, 0, (sockaddr*) &Addr, &Len);
if (Num > 0) // Empfang mit Lànge größer Null an Callback übergeben

mp_Buf ist ein char[512] und ich habe die Erfahrung gemacht, dass das
funktioniert. Allerdings nicht annàhernd mit Gigabit-Datenraten, das
habe ich noch nie versucht, aber da wàre wohl auch TCP besser geeignet.

Ähnliche fragen