UDP Server und Client in Delphi

8

Ich mache ein UDP C / S. Ich habe ein Problem mit der Anzahl der Daten, die der Server pro Sekunde empfangen kann.

Ich habe das Senden von Stapeln von 10, 100, 1000 Datennachrichten an den Server getestet, 10, 100 wurden ohne Probleme empfangen. Beim Senden 1000, nur 300 ~ 400 empfangen. Alle Tests wurden lokal durchgeführt.

Ich habe versucht, den Server zu implementieren, indem ich den Twsocket von ICS und den tudpblocksocket von Synapse benutze. Beide haben sich mit dem gleichen Problem oben gelöst.

Kann mir jemand erklären, warum dies passiert und wie ich die Serverleistung verbessern könnte.

Code mit TUDPBlockSocket

...

%Vor%

...

Code mit ICS

...

%Vor%     
Darkerstar 05.12.2010, 15:56
quelle

2 Antworten

13

UDP garantiert keine Nachrichtenzustellung - wenn kein Platz im Puffer ist, wird das Paket ohne zu zögern gelöscht. Wenn Sie eine garantierte Zustellung benötigen, verwenden Sie TCP und erstellen Sie ein nachrichtenbasiertes Kommunikationsschema auf TCP. Oder nutzen Sie unser MsgConnect Produkt, das es bereits hat. Hinweis für Kreuzfahrer: MsgConnect hat eine Open-Source-Version.

    
Eugene Mayevski 'Allied Bits 05.12.2010, 15:59
quelle
3

Wenn Sie das UDP-Protokoll verwenden und kein Paket verlieren möchten, müssen Sie Ihrem Programm einen Bestätigungsmechanismus hinzufügen, da UDP-Pakete während der Übertragung verloren gehen können. Dieser ACK-Mechanismus ist bereits im TCP-Protokoll implementiert, daher ist es die beste Wahl für Leistung und Konsistenz.

Wenn Sie TCP nicht verwenden können (vielleicht hat Ihr Client nicht genügend CPU-Leistung oder RAM, um mit TCP zu arbeiten), sollten Sie ein einfach zu codierendes UDP-basiertes Protokoll wie TFTP verwenden. Wir haben einen TFTP-Client und -Server über unsere SynCrtUnit implementiert, aber Sie haben eine solche Komponente in Synapse. Aber TFTP ist langsam, weil es auf ein ACK-Signal für jedes übertragene Paket wartet. Sie werden also kein Paket verlieren, aber die Geschwindigkeit ist im Vergleich zu TCP schlecht.

Letztes Jahr habe ich einen solchen TFTP-Server in Delphi und dann einen TFTP-Client in TP 7 in einer DOS-basierten automatisierten Engine implementiert. Das funktionierte großartig, und einige Objektstrukturen wurden zwischen beiden Enden geteilt. Der TFTP / UDP / IP-Stack wurde in reinem TP 7 mit nur statisch zugewiesenem Speicher codiert und funktionierte großartig.

Wenn Sie jedoch keine "niedrigen CPU-Anforderungen" haben, sollten Sie lieber TCP / IP anstelle von UDP / IP verwenden. Wenn Sie zum Beispiel etwas Broadcasting benötigen, dann verwenden Sie UDP, aber mit einer Art ACK-Mechanismus.

    
Arnaud Bouchez 06.12.2010 06:56
quelle

Tags und Links