So senden Sie große Daten mit C # UdpClient?

8

Ich versuche, eine große Menge von Daten (mehr als 50 MB) mit C # UdpClient zu senden.

Also teile ich zuerst die Daten in 65507 Byte-Blöcke und sende sie in einer Schleife.

%Vor%

Mein Problem ist, dass nur die ersten Pakete empfangen werden können. Während des Sendens des ersten Pakets erhöht sich die Netzwerklast schnell auf 100%, und dann können die anderen Pakete nicht empfangen werden.

Ich möchte so viel Datendurchsatz wie möglich bekommen.

Tut mir leid für mein Englisch! Vielen Dank für Ihre Hilfe im Voraus.

    
raisyn 23.02.2010, 15:52
quelle

4 Antworten

2

Ich weiß nicht speziell über. NET-Implementierung, es könnte Ihre Daten puffern, aber UDP-Datagramm wird normalerweise durch die MTU-Verbindung begrenzt, die 1500 auf normalen Ethernet ist (subtract 20 Bytes für IP-Header und 8 Bytes UDP Überschrift.)

UDP darf die Datagramme explizit ablegen und neu anordnen, und es gibt keine Flusssteuerung wie in TCP.

Bei Überschreitung des Socket-Sendepuffers auf der Senderseite ignoriert der Netzwerkstapel die folgenden Sendeversuche, bis der Pufferspeicherplatz wieder verfügbar ist (Sie müssen dafür den Rückgabewert von send() überprüfen.)

Bearbeiten:

Ich würde dringend empfehlen, mit TCP für große Dateiübertragungen zu gehen. TCP ermöglicht die Sequenzierung (Sie müssen keine verloren gegangenen und neu geordneten Pakete verfolgen.) Es verfügt über eine erweiterte Flusskontrolle (der schnelle Sender überfordert also nicht einen langsamen Empfänger). Er tut auch Pfad-MTU-Erkennung (dh findet optimale Daten Datenpaketierung und vermeidet IP-Fragmentierung.) Andernfalls müssten Sie die meisten dieser Funktionen selbst neu implementieren.

    
Nikolai Fetissov 23.02.2010, 16:09
quelle
9

Für all jene Leute, die sagen, TCP zu benutzen .... sind töricht falsch. Obwohl TCP zuverlässig ist und das Fenster vom Kernel beibehalten wird, ist es ein "set and forget" -Protokoll, aber wenn es darum geht, 100% seines Durchsatzes zu verwenden, wird TCP nicht ausreichen (es drosselt zu stark und das Warten auf ein ACK stellt automatisch wegen der RTT mindestens 50% Papierkorb dar.

Zu der ursprünglichen Frage, dass Sie UDP-Pakete Nonstop in dieser For-Schleife senden, füllt sich das Fenster und dann werden alle neuen Daten sofort gelöscht und versuchen nicht einmal, in der Leitung zu gehen. Sie teilen Ihre Daten auch zu groß auf. Ich würde empfehlen, einen eigenen Drosselmechanismus zu bauen, der mit 2k-Segmenten pro Sekunde startet und langsam hochfährt. Jedes "Segment" enthält eine SEQ (Sequenzkennung für Bestätigungen oder ACK) und OFF (Offset innerhalb der Datei für diesen Datensatz). Lassen Sie den Server diese Tags verfolgen, während die Daten markiert werden. Wenn die andere Seite sie erhält, speichert sie die SEQ-Nummern in einer ACK-Liste und alle fehlenden SEQ-Nummern werden in eine NACK-Timerliste aufgenommen. Wenn der Timer abgelaufen ist (wenn sie nicht empfangen wurden), wird sie in eine NACK-Liste verschoben . Der Empfänger sollte 5 oder so ACKs von der ACK-Liste zusammen mit bis zu 5 NACKs in einer einzigen Übertragung alle paar Sekunden oder so senden. Wenn der Absender diese Nachrichten empfängt und es irgendwelche NACKs gibt, sollte er sofort das fehlende Fragment herunterdrosseln und erneut senden, bevor er fortfährt. Die Daten, die ACKed sind, können aus dem Speicher freigegeben werden.

Viel Glück!

    
sabriath 07.08.2010 10:33
quelle
2

Ich hasse es zu sagen, aber Sie müssen den Faden schlafen. Sie überlasten Ihren Durchsatz. UDP ist nicht sehr gut für verlustfreie Datenübertragung. UDP ist für, wenn Sie nichts dagegen haben, einige Pakete fallen zu lassen.

    
msp 23.02.2010 16:02
quelle
0

Zuverlässig - nein, Sie werden es nicht mit UDP machen.

Soweit ich es verstehe, ist dies sinnvoll, wenn Sie es gleichzeitig an mehrere Computer senden (Broadcasting).

In diesem Fall

  • stelle eine TCP-Verbindung mit jedem von ihnen her,
  • Teilen Sie die Daten in Blöcke,
  • Geben Sie jedem Block eine ID,
  • Liste der IDs an jeden Computer mit TCP-Verbindung senden,
  • Broadcast-Daten mit UDP,
  • informieren die Clients (über TCP), dass die Datenübertragung abgeschlossen ist,
  • als Clients sollten fragen, die verlorenen Pakete
  • erneut zu senden
bohdan_trotsenko 23.02.2010 16:36
quelle

Tags und Links