Laden...

Forenbeiträge von GaHero Ingesamt 6 Beiträge

05.08.2011 - 08:33 Uhr

Danke für die Links, aber die TCP Seite des Programms stellt nicht das Problem dar. Dort gehen mir ja keine Daten verloren, wenn der Buffer, den ich übergebe zu klein ist. Die kann ich ja mit einem erneuten Aufruf einlesen.

Es geht mir generell um UDP Sockets. Mir erschließt sich nicht wie man ein ähnliches Beispiel, wie das, was du gepostet hast dort umsetzten kann, da die Daten bei einem zu kleinen Buffer laut der MSDN Hilfe verloren gehen. Es scheint ja aber zu gehen, da die Klasse UDPClient mir eine Methode zur Verfügung stellt, die genau das macht. Nämlich ohne einen übergebenen Buffer mir die Daten zurückgeben, die reingekommen sind.

04.08.2011 - 13:55 Uhr

Ich benutze da im Moment noch die UdpClient Klasse. (Hatte das oben falsch angegeben) Diese hat eine Methode (Recieve), die mir direkt ein byte Array zurück gibt. Also scheint es doch iwie zu gehen, wenn man die genaue Größe nicht weiß. Ich könnte natürlich auch von dieser Klasse die asynchronen Methoden verwenden, die ebenfalls diese Möglichkeit bieten, aber ich wollte mich gerne mit der Socket Klasse näher beschäftigen.

Und irgendwie muss ja diese UdpClient.EndReceive Methode funktionieren, das würde ich gerne verstehen...

04.08.2011 - 13:20 Uhr

Ich plane im Moment eine bereits vorhandene Anwendung, die noch die synchronen Methoden der Socket Klasse benutzt, um Daten zu empfangen und zu senden, auf die Asynchronen Methoden umzustellen. Die synchronen Methoden laufen in einem eigenen Thread und ich wollte mich mal etwas näher mit der Möglichkeit der async Methoden beschäftigen und die Performance vergleichen.

Leider bin ich bei der Planung auf ein Problem gestoßen, was ich selber nicht gelöst bekomme. Die async Methode zum Empfangen von Daten über udp Verbidnungen (Socket.BeginReceiveFrom) erwartet von mir einen Buffer, sowie eine Länge. Ich weiß aber garnicht wieviele Daten herein kommen werden, da die Gegenseite aus einer Reihe unterschiedlicher anderer Programme besteht. In der MSDN Hilfe zu der Funktion habe ich dann den Hinweis gefunden, dass bei einer zu kleinen Buffer Größe, die nicht gespeicherten Daten verloren gehen und eine Exception ausgelöst wird.

Da meine Gegenseite die Daten nur einmal sendet und ich die Länge nicht weiß, laufe ich also zwangsläufig in den Fall eines Datenverlusts. Die einzige Möglichkeit, die ich bisher gefunden habe ist, meinen Buffer so groß zu machen, dass jedes Udp Packet dort locker hineinpasst (65.535 Bit UDP Datagram - 64 Bit UDP Header). Das widerspricht aber meinen Bestrebungen den Speicherverbrauch, sowie die Performance auf einem guten Niveau zu halten.

Gibt es hier noch eine andere Möglichkeit? Die neuen Async Methoden kann ich auch nicht einsetzten, da ich nur das Framework in Version 2.0 verwende.

Danke im voraus!

21.03.2011 - 07:26 Uhr

Evtl. hilft auch, BindingSource.RaiseListChangedEvent=false zu setzen

Besten Dank, genau das war es. Ich habe zwar noch leichte Probleme mit dem Aktualisieren selber, das läuft noch nicht rund, aber im groben und ganzen klappt es jetzt so wie ich es haben wollte.

14.03.2011 - 08:36 Uhr

Ich zeige in meinem Programm eingehende Daten von Netzwerkverbindungen an. Es dient hauptsächlich dazu den Datenverkehr zu testen.

Die Objekte, die ich mir aus den Bytes des Netzwerkverkehrs erstelle, speichere ich dazu in einer Bindinglist, die über eine Bindingsource an ein Datagridview gebunden ist. Da mit dem Programm mehrere Verbindungen gleichzeitig getestet werden können, gibt es meistens mehrere von diesen Datagridviews. Dies funktioniert auch mittlerweile auch alles recht gut.

Gleichzeitig kann der User über das DataGridView die Daten per Hand ändern und so die Schablone auf die der Datenverkehr getestet wird ändern.

Allerdings habe ich mittlerweile Probleme, wenn die eingehenden Daten zu schnell hereinkommen. Ab einem zeitlichen Abstand von unter 50ms, steigt die CPU Belastung auf 100%. Durch ein paar Tests habe ich herausgefunden, dass es an der Anzeige liegt, die ja jedesmal aktualisiert wird (dank des Bindings), wenn die zugrunde liegende Liste geändert wird.

Meine Idee war es jetzt, die Anzeige in regelmäßigen Zeitabständen zu aktualisieren. Und das auch nur dann, wenn neue Daten vorliegen. Es ist nämlich nicht sehr wichtig immer die aktuellsten Daten zu sehen (was bei 50ms Updates sowieso kein menschliches Auge mitmacht), sondern eher zu sehen, dass überhaupt Daten reinkommen.

Ich habe aber bisher keine Möglichkeit gefunden, das zu realisieren. Wie genau kann ich eine zeitabhängige Aktualisierung einbauen ohne mein bisheriges Konzept komplett umzuwerfen (sodass der User immer noch per DataGridView eingaben machen kann)? Muss ich noch eine Datenschicht dazwischen einbauen? Eine Datatable, die aus der Bindinglist gefüttert wird und per Timer das DataGridView aktualisiert? Bitte gebt mir ein paar Stichwörter.

Danke im Voraus

21.11.2008 - 17:08 Uhr

Hallo,

geiles Projekt, werd eich wahrscheinlich in meinen Progs nutzen.
Aber 2 Fragen:

1.) Bei mir hängt das erstellen eines Projektes dort, wo der Server geprüft wird. (Dateien und Ordner sind auf dem FTP vorhanden). Der Link stimmt, ebenso wie der Benutzername und das Passwort. Ist das ein Bug (geh ich mal nicht von aus), oder woran liegt es. (testweise allen Ordnern samt Dateien Rechte 777 gegeben, hat nichts geholfen)

2.) Mit welchem Prog hast du die Setup gemacht? Ist das kostenlos wäre das ziemlich gut für mich, da ich nach etwas suche, was mir das Net Framework vor dem Setup runterzieht und installiert!

Viel Erfolg weiterhin,
GaHero