Laden...

Forenbeiträge von Qwald Ingesamt 214 Beiträge

28.01.2007 - 17:21 Uhr

Hallo,
ich möchte eine Server-Anwendung erstellen, die man später auch über Telnet bedienen kann. Dabei werden (vollständige) Befehle mit einem Zeilenumbruch abgeschlossen.

Also sie werden so übertragen:
ein_befehl argument argument argument [Zeilenumbruch]

Das Problem bei dem Telnet Client (unter Windows), ist das die eingegebenen Zeichen sofort übertragen werden, und der Client nicht wartet bis man Enter drückt. Dies führt u.U. zu Problemen wenn man Backspace drückt, dass man beim Server auch ein Backspace übertragen bekommt

Nun meine Frage:
Ich wollte einen StreamReader benutzen und dort dann die Funktion .ReadLine() verwenden, in etwa so (verkürtzt):


while(client.Connected)
{
   string cmd = reader.ReadLine();
   
   //CMD an einen Interpreter senden, der den Befehl verarbeitet 
}

Aber wie sieht dies mit der Perfomance aus? Die Server-Applikation soll nicht schon nach dem 5 User zusammenbrechen, sondern sofern es möglich ist, auch über 100 laufende Sitzungen bearbeiten/verwalten können. Führt hier der StreamReader evt. zu Problemen, was die Rechenauslastung betrifft (die Anwendung muss möglich Sparsam im "Verbrauch" sein)?

Alternativ wäre auch ein asynchroner Lesevorganng möglich. Das Problem hierbei ist aber, wie gesagt, dass der Telnet-Client jedes Zeichen sofort überträgt. Ich müsste also überprüfen ob ein Zeilenumbruch mit übertragen wurde und z.B. Backspace mit beachten. Drum würde ich lieber den StreamReader verwenden, sofern dies von der Rechenauslastung möglich ist.

Hat jmd. Erfahrungen damit gemacht, und wozu würdet ihr mir raten?

PS: Und gibt es evt. einen Trick wie ich asynchrones Lesen vereinfachen kann? Also das das Befehl richtig übertragen wird bzw. das asynchrone Lesen nur anspringt, sobald auch ein Zeilenumbruch vorhanden ist. Ist evt. auch eine Kombination aus beidem möglich, dass ich im Callback überprüfe ob ein Zeilenumbruch im Stream vorhanden ist, und ich dann ReadLine() verwende?

26.01.2007 - 20:28 Uhr

Hallo,
ich meine wenn man die Methode rtf.AppendText("Neuer Text"); verwendet, scrollt er automatisch an das Ende der Textbox.

Sonst musst du per SelectionLength/-Start die gesamte Textbox einspannen und dann ScrollToCaret() aufrufen.

21.01.2007 - 13:47 Uhr

Hallo,
in der User32.dll sind die Funktionen SendInput und die deutlich leichter zu bedienende keybd_event Funktion (funktioniert auch noch unter Win2k und XP, ist aber überholt, dafür deutlich leichter zu bedienen als SendInput).

Persönlich verwende ich auch die keybd_event und hatte damit soweit keine Probs.

Hier mal die Deklaration:


[DllImport("user32.dll")]
private static extern void keybd_event(int vk, byte bScan, int dwFlags, int dwExtraInfo);
private const byte KEYUP = 0x0002;

Dabei steht das erste Argument vk für VirtualKey. Die Int Werte sind in dem Enum Keys hinterlegt, einfach z.B. Keys.E nach in Convertieren.

Dann bei dwFlags musst du angeben, ob der Button gedrückt wird (Wert: 0) oder ob er losgelassen wird (KEYUP).

Fertig würde es etwa so aussehen:


keybd_event((int)Keys.ControlKey, 0, 0, 0);
keybd_event((int)Keys.E, 0, 0, 0);

keybd_event((int)Keys.E, 0, KEYUP, 0);
keybd_event((int)Keys.ControlKey, 0, KEYUP, 0);

18.01.2007 - 20:24 Uhr

Hallo,
danke, klappt bestens.
Mittlerweile ist mir auch klar, warum mein Ansatz so nicht klappt. Ich muss ja auch noch die RTF Codes beachten.... 👍

18.01.2007 - 17:41 Uhr

Hallo,
ich verwende eine RichTextBox um verschiedene Statusinformationen auszugeben. Dabei sollen manche Informationen Fett geschrieben werden.

Dies habe ich so gelöst:


private void InsertText(string text, bool bold)
{
txtLog.AppendText(text);
 if (bold)
  {
  txtLog.SelectionStart = txtLog.Text.Length - text.Length;
  txtLog.SelectionLength = text.Length;
  txtLog.SelectionFont = new Font(txtLog.Font.FontFamily, txtLog.Font.Size, FontStyle.Bold);
   }
}

Ruft man diese Funktion auf, gibt man an, ob der Text Fett dargestellt werden soll, oder nicht.

So jetzt kann es vorkommen, dass das letze Zeichen aus der txtLog gelöscht werden muss, also praktisch soetwas wie Backspace. Einfach "\b" hinzufügen funktioniert nicht, da dies dann als Kästchen angezeigt wird.

Also habe ich folgende Funktion:


private void RemoveLastSign()
{
  txtLog.Text = txtLog.Text.Remove(txtLog.Text.Length - 1);
}

Das Problem ist aber jetzt, sobald ich diese Funktion aufrufe, wird der gesamte Text der RichtTextBox fett dargestellt und nicht mehr die paar, speziellen Zeilen.
Die SelectionLength auf 0 zu setzen, bevor das letzte Zeichen gelöscht wird, hilft leider nicht.

Im Font der RichTextBox ist der Wert für Bold weiterhin auf false gesetzt.

Wodran liegt dieser Fehler und wie kann ich ihn beheben?

14.01.2007 - 14:57 Uhr

Hallo,
einer Funktion von mir wird ein Buchstabe als Keys (aus dem Enum) übergeben.
Jetzt gibt es dort Buchstaben wie z.B. Keys.Oem2, was auf einer deutschen Tastertur dem # entspricht, auf der englischen aber dem / entspricht.

Gibt es unter .NET nun eine Funktion, welches mit solch ein Keys-Enum in ein Char/String konvertiert, abhänig von dem eingestellten Tastertur-Layout (oder notfalls mit dem deutschen Layout)?

Danke im Vorraus.

13.01.2007 - 18:46 Uhr

Hallo,
ich würde dir zu Java raten.

Denn:

  1. Java und C# sind sehr sehr ähnlich, sie unterscheiden sich nur in ein paar Schlüsselwörtern und im Aufbau des Frameworks (und in ein paar Funktionalitäten)

  2. Da Java Programme plattformunabhänig sind, ist das die ideale Ergänzung zu C#. Mit C# kann man schön Windows Programme erstellen, soll es aber unabhänig sein, dann greift man zu Java. Bei C++ ist dies deutlich problematischer ein Programm mit einer GUI für mehr als 1 Betriebssystem bereit zu stellen.

  3. Also ich habe früher mit Visual C++ (98) GUIs geschrieben/programmiert. In Vergleich zu .NET ist es echt der Horror! Wenn du ein verwöhnter Hochsprachen-Programmierer bist, wird dir C++ vermutlich kein Spaß machen.

  4. C++ hat doch schon seine Jahre auf dem Buckel. Viele Funktionen, die man alltäglich braucht, werden bei (ANSI) C++ einfach nicht mitgeliefert. In C++ ist es z.B. Multi-Threading oder Socket-Programmierung (deutlich) komplizierter. Und für andere Bereiche, die man auch regelmäßig verwendet, wie z.B. XML, muss man auf eine externe Library setzen. Auch muss man viele Datenstrukturen selber programmieren, bzw. aus einer fremd Library verwenden, wie z.B. List, Hashtable, Stack oder Queue.

PS: Was an Java auch ganz lustig ist, sind neben den Java Applets auch noch, dass man damit Programme für z.B. Mobiltelefone schreiben kann, was auch gar nicht so schwer ist. Wenn du also ein Java fähiges Handy hast (eigentlich alle neuen), dann kannst du dort die ein oder andere Applikation erstellen, die du benötigst.

Also unterm Strich: Entweder Java, oder ggf. die Kentnisse in C# verbessern.

Und zu Assembler:
Personen die gerne Ergebnisse sehen, die sollten doch davon die Finger lassen. Wer aber wissen möchte, wie so die CPU funktioniert, für den ist sind Assembler-Grundlagen doch praktisch.

Wenn jmd. evt. einen Lego Mindstorms Kasten zuhause hat, dem würde ich empfehlen, diesen mal mit LASM zu programmieren. Ist doch sehr intressant wie so ein (simpler) MC funktioniert.

10.01.2007 - 16:57 Uhr

Hallo,

Original von Borg

  1. Die while-Schleife als "nicht schön" zu beschreiben ist leider ein Euphemismus.

Ich weiß das die While-Schleife eigentlich totale Kacke ist, kann ich leider nicht ändern.

Ich wollte eine GUI für das Spiel erstellen. Das Spiel ist aufgeteilt in eine DLL, die die gesamte Spiel-Logik enthält.
Dieser DLL übergebe ich ein Delegate (mit Rückgabewert int), die dann die Auswahl des Users zurückgibt.

Die Spiele DLL an sich war ursprünglich für eine Konsolen-Anwendung geschrieben. Dort konnte man dann in der Funktion einfach Console.ReadLine(); verwenden.
Ich wollte das Spiel etwas erweitern mit einer GUI, kann aber nicht die Spiele-DLL soweit anpassen, leider.

In der Spiele-DLL ist ein Thread der das Spiel 'spielt', und sobald dieser Thread (das Spiel) eine Aktion vom User erwartet, ruft der die mit dem delegate Verknüpfte Funktion auf.

  1. Ist die Form nach dem Maximieren fokussiert?

Ja natürlich. Auch das defokussieren, was ja z.B. beim minimieren passiert, und nach dem erneute fokussieren, passieren keine Key-Events (kein Up, Down, Press) mehr.

Stoße im KeyDown-Event die Aktion aus, die passieren soll,

Wie gesagt, leider kann ich die Spiele-DLL nicht umschreiben, sonst wäre das natürlich der Ansatz den ich gewählt habe.

PS: Also das Form (bzw. Buttons) reagieren noch ganz normal. Nur wird sich ein User wundern, warum er aufeinmal nicht mehr die Tastatur benutzen kann.

09.01.2007 - 19:43 Uhr

Hallo,
ich schreibe gerade ein kleines Spiel. Dabei muss der Mensch, sofern er dran ist, die Tasten zwischen 1 und 3 drücken.

Der Spiele-Engine ruft eine Methode auf, diese Methode soll dann den User "fragen", welche Aktion (1-3) er druchenführen möchte, und gibt dann diese an die Spiele-Engine (externe Dll) zurück.
Das ganze ist mit einer GUI versehen.

Also die Funktion sieht so aus:


int aktion = 0;
public int GetSpalteFromUser()
{ 
   while(aktion == 0)
    {
       Application.DoEvents();
       Thread.Sleep(25);
    }

   int tmp = aktion;
   aktion = 0;
   
   return tmp;  
}

So jetzt habe ich für das Form ein KeyDown-Event definiert:


private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    //If gedrückte Taste 1, 2 oder 3, dann schreibe in aktion die Zahl 1,2 oder 3
}

Sofern das Fenster dauerhaft aktiviert ist, funktioniert dieser Mechanismus einwandfrei.
Wenn ich aber der Fenster z.B. minimiere, und es dann wieder maximiere, dann wird kein Key-Event mehr ausgelöst (überprüft mit Breakpoint und mit Debug.Write) und das Programm verweilt in der Schleife.

Wodran liegt dieses?

Ich weiß, die Lösung mit der While-Schleife ist nicht die schönste. Allerdings habe ich leider keinen Zugriff auf die Spiele-Dll so das ich es ändern könnte.

04.01.2007 - 16:48 Uhr

Hallo,
ich programmiere gerade eine Server Anwendung und es sehr sinnvoll, wenn ich mehrere, getrennte "Datenkanäle" hätte.

Also der Server lauscht auf einem bestimmten Port, der Client verbindet sich dann und übertägt dann ein Passwort. Wenn das PW falsch ist, dann schließt der Server die Verbindung.

Es gibt jetzt bestimmte Streams, die ich über diesen TCPClient senden möchte. Dabei sendet der Server zum Client einmal einen Video-Stream und einen Sound-Stream (getrennte Informationen), desweiteren sendet der Server gelegentlich Status-Informationen.
Der Client selber kann bestimmte Steuerkommandos senden, um die Server-Anwendung zu steuern. Auf manche Steuerkommandos antwortet der Server.

Es wäre jetzt sehr praktisch, wenn ich mehrere Kanäle/Streams zur Verfügung hätte. Mein Objekt zur Video-Darstellung würde ich dann den Video-Stream zuweisen, dem Audio-Objekt dann den Audio-Stream etc.
Sprich die Streams sollten sich nicht gegenseitig beeinflussen.

Eine Möglichkeit wäre z.B., dass der Server auf mehreren Ports lauscht, pro späteren Kanal ein Port, und dass dann das Video-Objekt auf Port 2001, Audio-Objekt auf Port 2002 usw. eine Verbindung aufbaut. Jedes Objekt hätte dann seinen eigenen TCPClient.

Mein Problem bei der Lösung ist die Wartbarkeit. Ich müsste bei jedem Port die Authenfizierung integrieren, desweiteren müsste der Client genau wissen, auf welchem Port er was findet, was sich schlecht warten lässt.

Eine andere Möglichkeit wäre, vor den Daten-Packete ein Prefix anzuhängen, welches das Ziel-Objekt identifiziert.
Dies ist aber, wie ich finde, auch keine zufriedenstellende Möglichkeit. Denn der Video-Stream (beim Server) wird einfach auf den Netzwerk-Stream umgelenkt und der Client liest den Netzwerk-Stream aus und stellt diesen dar.
Dort müsste ich dann jedes mal das Prefix hinzufügen, um es dann am Ziel wieder zu entfernen.

Gibt es also eine Möglichkeit, wie ich über einen bestehende TCP-Verbindung mehrere Network-Streams generieren kann?

26.12.2006 - 19:05 Uhr

(Verwende Visual C# Express 2005)

Hallo,
ich habe ein Projekt, welches sich aus mehreren Projekten zusammensetzt. Dabei ist u.a. eine Windows-Anwendung (Startprojekt) und ein Library-Projekt.

So in der Windows-Anwendungen möchte ich die DLL des Library Projektes dynamisch laden, womit ich keinen Verweis auf das Projekt setzen kann (Verweis mein ich wie Verweis auf System.Windows etc.).

So ich habe nun so einen Verzeichnisbaum:


WindowsApp
  Bin
   Debug

Library
  Bin
   Debug

Die WindowsAnwendung wird ihn ihren Debug-Order kompiliert, die Library (DLL) wird aber in einen anderen Debug-Ordner kompiliert, da sich ja die Projektdateien in verschiedenen Ordner befindet.

Das Problem ist nun, dass die WindowsAnwendung erwartet, dass die dynamisch zu ladene DLL sich in ihrem Verzeichnis befindet.

Wenn ich also eine Änderung an der Library durchführe, muss ich in das Verzeichnis Library\Bin\Debug gehen, dort die Library rauskopieren und in WindowsApp\Bin\Debug einfügen.

Dies ist aber relativ umständlich nach.

Darum würde ich gerne das Buildverzeichnis der Library ändern, so dass es nicht mehr Library... ist sondern jetzt WindowsApp\Bin\Debug ist.

Wie funktioniert dies?

Wenn ich unter Projekt => Library Eigenschaften gehen, und dort den Ausgabepfad anpasse, dann lässt dies den Compiler ziehmlich unbeeindruckt und die Library wird weiter im falschen Ordner abgespeichert.

26.12.2006 - 13:47 Uhr

Hallo,
bin mir nicht ganz sicher, aber ich glaube es gibt unter .NET eine Componente, die Internet Explorer oder so ähnlich heißt.

Ist ein kleines Fenster, ähnlich wie eine Textbox, wo HTML Seiten angezeigt werden können, unter der Verwendung der Engine des Internet Explorers.

Du kannst dann per Code definieren, welche URL geladen werden soll.

PS: Es kann auch ein COM Object sein, einfach mal nachgucken

Edit: Also unter .NET 2.0 gibt es das Form 'Webbrowser' (unter Alle Windows Forms). Das sollte helfen

25.12.2006 - 20:39 Uhr

Hallo,

  1. Welches DBMS (welche Datenbank-Software) möchtest du verwenden?
  2. Willst du auch noch SQL erlernen, oder nur den Zugriff per C#?

Ich würde empfehlen, SQL seperat zu erlernen und dann erst damit beschäftigen, wie man per C# auf eine Datenbank zugreift.

04.12.2006 - 17:14 Uhr

Hallo,
ich bin mir sicher, dass es dafür eine Library gibt. Einfach mal bei bekannten Codesammlungen, wie z.B. Codeproject o.ä. nachschauen.
Sonst eine C-DLL verwenden, die du dann per DllImport verwendest.

30.11.2006 - 21:52 Uhr

Hallo,

Original von FZelle
Bereits das Disassemblieren, also lesbar machen meines Codes ist ein
verstoss gegen meine Eigentumsrechte.

Und sobald unter einem Mercedes liegst verstößt du gegen die Eigentumsrechte von den Ingenieuren, denn du **könntest **ja das das Design der Ölwanne klauen. Und wer seinen Computer aufschraubt, wird bald zum Tode verurteilt, der Gesetztentwurf liegt schon vor...

Es ist in Deutschland nicht verboten zu disassemblieren, denn es ist nichts anderes als Bytes in Buchstaben/Befehle zu übersetzen. Des Weiteren kann man i.d.R. eh keinen Schutz einbauen, der dies erkennen & melden würden und Leute, die dein Programm disassemblieren, achten eh nicht darauf ob es laut EULA, die auch keine Wert vor Gericht hat, jetzt verboten bzw. erlaubt ist.

In manche Staaten ist es verboten, ich glaube in Frankreich, allerdings nicht in Deutschland.

Viele Firmen untersagen das Reverse Engineering ihrer Produkte durch entsprechende Lizenzbedingungen. Zudem sind solche Lizenzklauseln in vielen Ländern generell ungültig, da den Nutzern einer Sache gesetzlich das Recht zusteht, zur Überprüfung der Anwendungssicherheit (siehe auch Trojanisches Pferd) oder zur Fehlerbehebung ein von ihnen erworbenes Softwareprodukt einem Reverse Engineering zu unterziehen. Das reine Untersuchen von Dingen, die einem selbst gehören, darf man gegebenenfalls der Freiheit der Forschung zuordnen, so dass ebenfalls entsprechende Lizenzklauseln nicht greifen. Oftmals dienen solche Lizenzklauseln eher dem Zweck der Abschreckung.


>

30.11.2006 - 17:08 Uhr

Hallo,

  1. bei der PHP Funktion ist 'rl' nicht der Schlüssel, sondern die Seed. Dies ist in etwa vergleichbar mit einer IV.
  2. crypt verwendet den DES Algorithmus nicht zum Verschlüsseln, sondern als Hash-Verfahren. Dabei wird die Seed am Anfang des UserPws gestellt.

Also:
Ausgabe: seed+hashalgo(seed+userpw);

In C# dient aber DES weiter als Verschlüsselungsverfahren und du könntest selber davon ein Hashverfahren adaptieren, was nicht zu empfehlen ist. Allerdings würde ich dir empfehlen, auf SHA1 umzusteigen, wenn du wirklich nur einen Hashwert benötigst und nicht etwa etwas verschlüsseln möchtest.

Merh zum IV:
http://de.wikipedia.org/wiki/Initialisierungsvektor

Wie crypt unter PHP / Unix arbeitet:

The traditional implementation uses a modified form of the DES algorithm. The user's password is truncated to eight characters, and those are coerced down to only 7-bits each; this forms the 56-bit DES key. That key is then used to encrypt an all-bits-zero block, and then the ciphertext is encrypted again with the same key, and so on for a total of 25 DES encryptions. A 12-bit salt is used to perturb the encryption algorithm, so standard DES implementations can't be used to implement crypt(). The salt and the final ciphertext are encoded into a printable string in a form of base 64.

Mehr zu crypt:

>

25.11.2006 - 13:45 Uhr

Hallo,

Original von emwe
Ich will eine Grundsicherung meines geistigen Eigentums gewährleisten.

Dies ist bei größeren Projekten in Deutschland automatisch gegeben, sofern man es nicht ausdrücklich außerkraft hebt.

D.h. das Projekt darf nicht disassembliert, reverse-engineered, .... werden.

Solch eine Lizenz wirst du zum Glück nicht finden, denn dafür gibt es in Deutschland keine gesetzliche Grundlage. Wäre genauso als wenn man ein Auto kauft und nur Vetrags-Werkstätten die Motorhaube öffnen dürften.

Also gegen soetwas gibt es zum Glück keine rechtliche Grundlage, es wäre sonst fatal.

Wenn aber ein Konkurrent deinen Code klaut, durch disassemblieren, und du es ihm nachweisen kannst, dann ist das ein Verstoß gegen das Copyright-Gesetzt.

24.11.2006 - 15:46 Uhr

Hallo,
Knoten oder Konten???

Also eine Möglichkeit wäre, ob in dem String ein Zeichen mit einem Charcode > 255 vorkommt.
Denn in der englischen Sprache verwendet man normalerweise nur Zeichen bis Nummer 127, wobei dann das ASCII Alphabet auf 255 Zeichen, für Sonderzeichen etc., erhöht wurde.

Ob deutsche Umlaute einen höheren Charcode als 255 in UTF haben, kann ich jetzt so nicht sagen, allerdings sind sie ersten 128 Zeichen gleich dem ASCII Standard.

23.11.2006 - 18:00 Uhr

Hallo,
naja normalerweise gibt man ja den Username ein, da mit sich IDs doch schlecht merken kann.

Dann kannst du userid = xxx weglassen, musst dann aber sicher stellen, dass die Usernames einzigartig sind, am besten das Feld auf 'Unique' (sofern vorhanden) stellen.

22.11.2006 - 19:57 Uhr

Hallo,
der übliche Weg um PWs abzuspeichern, ist indem man diese als Hashwert, z.B. als MD5 oder SHA1 Hashwert, abspeichert.
Der Vorteil daran ist, dass man diese nicht mehr entschlüsseln kann, also die Hashwerte können nicht mehr in die Passwörter zurückübersetzt werden. Wenn jmd. also die DB klaut, so kann er die Passwörter nicht auslesen.

Dennoch kann man weiterhin überprüfen, ob der User das richtige PW eingegeben hat, und zwar so:

if(SHA1(txtPasswort.Text) == sha1HashAusDerDb)
//Login

Dabei berechnet die Funktion SHA1 den Hashwert eines Strings.
Nur wer das richtige Passwort eingibt, wird eingelogt (denn ein falsches PW ergibt einen anderen Hashwert) und dennoch kann man die Passwörter nicht aus der DB "klauen".

In .NET gibt es bereits eine integrierte SHA1 Funktion, ich glaube im Namespace System.Security.Cryptographie.

PS: Bevor jmd. sagt, man kann die PWs dennoch aus der DB klauen: Wenn man einen Hashwert von einem PW hat, kann man mit viel Rechenaufwand das Passwort herrausfinden, indem man von jedem Passwort den Hashwert bildet und diesem mit dem gestohlenem Hashwert vergleicht.
Verwendet man allerdings ein sicheres Passwort (a-z 0-9 Länge: >10), dann würde es Jahre dauern, dieses zu knacken.
Und da SHA1 weiterhin schwach kollisionsresisten ist, führt es darüber auch nicht zum Ergebnis.

22.11.2006 - 15:33 Uhr

Hallo,
evt. so:


if(txtUsername.Text == "Admin" && txtPasswort.Text == "geheim")
  MessageBox.Show("Hallo im internen Bereich");
else
  MessageBox.Show("Benutzername/Passwort falsch");

Wobei du dann natürlich die starre Überprüfung durch eine Hash-Liste ersetzen kannst.
Ob in der Hashliste der eingegebene Username vorkommt, und ob das PW, welches in der Hashlist steht, gleich dem eingegebenem ist.

09.11.2006 - 18:52 Uhr

Hallo,
erstmal ein Lob an dich, dass du dir die Mühe machst, diese doch recht neue Technik vorzustellen. 👍

Weiß jmd. evt., ob es bereits ein Visual Studio gibt (oder ein Tool dafür), welches dieses neu Framework unterstützt, besonders die WPF, oder muss man alles mehr oder weniger per Hand schreiben?
Wenn es noch kein VS dafür gibt, gibt es evt. einen Termin für das nächste Visual Studio, welches .NET3 unterstützt? Denn ich bin kein Freund vom selbst schreiben der Oberflächen 😉

07.11.2006 - 15:17 Uhr

Hallo,
das Problem ist, dass double ein Wertetyp ist, und auf dem Stack abgespeichert wird.
Immer wenn du es als parameter übergibst, wird der Wert kopiert, was bei referenztypen nicht der Fall ist.

Lösung: boxing auf object:
List<object> liste1 = new List<object>();
List<object> liste2 = new List<object>();

void function f1()
{
double meinDouble = 0.9;
liste1.Add((object)meinDouble );
f2((object)meinDouble);
}

void function f2(object d)
{
liste2.Add(0.4);
liste2.Add(d);
}

Oder alternativ eine Class erstellen, welches nur 1 public double Variable hat, und die Liste für Objekte der Klasse zuschneiden.

04.11.2006 - 16:21 Uhr

Hallo,
am besten eine fertige C# FTP Library runterladen, die hat dann meistens eine Funktion um die Rechte auszulesen.

03.11.2006 - 21:15 Uhr

Hallo,

Original von MrSparkle
Aber irgendwas braucht man ja, wenn man eine halbwegs interessante Software ein paarmal verkauft hat, ist sie nach etwa 1 bis 2 Tagen bei Emule zum Download verfügbar 🙂

ich kenn persönlich keine Software, die allgemein intressant ist, und die man nicht irgendwie umsonst bekommt, obwohl hinter solcher Software oft Milliardenschwere Unternehmen stecken, mit sehr ausgetüftelten Mechanismen.
Und bei denen geht es um deutlich mehr Geld als es wahrscheinlich bei dir geht.

Die einzig praktikable Lösung, die soetwas Aufhält, sind entweder Hardware Dongles, wobei manche auch Simuliert werden können, oder du lagerst den Dienst aus.
Sprich, dein Prog. greift auf Funktionen eines Webservices zurück.
Allerdings hat dies auch extreme Nachteile und wird zu keiner hohen Kundenzufriedenheit führen, was am Ende wahrscheinlich mehr Geld kostet, also du durch eventuelle Raubkopien verlierst.

01.11.2006 - 19:41 Uhr

Hallo,
wie liest du denn die Datei aus? Denn normalerweise sperrt man beim Lesen nicht die dazu, bzw. du musst ja eh nur die Datei auslesen, in einen Buffer den Inhalt abspeichern, und dann kannst du den Filestream ja auch wieder schließen.
Somit dauert das Auslesen pro Client nur wenige Millisekunden und du solltest dann eigentlich direkt auf die Datei schreiben können, ohne länger warten zu müssen.

31.10.2006 - 18:01 Uhr

Hallo,
für eine einfache Verschlüsselung & Entschlüsselung würde ich dir die Blowfish Implementierung von Markus Hahn empfehlen:
http://www.hotpixel.net/software.html [Blowfish.NET 1.03]

Diese Lib enthält auch eine Klasse, BlowfishSimple, die sehr leicht zu bedienen ist. Dem Konstruktor übergibt man das Passwort als String, und die Funktionen Encrypt() und Decrypt() erwarten den zu verschlüsselnen String als Parameter, und als Rückgabe erhält man dann den Geheim/Klartext.

Die Lib ist sehr gut geschrieben, und leicht zu bedienen, und man hat nicht den ganzen Umstand mit den Streams. Auch den Key kann man ganz einfach per String übergeben, und mit dem IV hat man auch kein Problem mehr, denn dieser ist der erste Block des Geheimtextes, und beim Entschlüsseln wird dieser automatisch eingelesen.
Für gehobenere Ansprüche gibts auch die komplexe Form des Algorithmus.

Ein weiterer Vorteil ist, dass die Klasse OpenSource ist, und sich somit keine Hintertüren sich dort verstecken können, sofern man den selber Algorithmus validiert, was ja bei CloseSource nicht möglich ist.

30.10.2006 - 17:51 Uhr

Hallo,
evt. versteh ich dich auch nur falsch, würde aber auf ein Denk Fehler tippen.

Also der allgemeine Ansatz ist:
Du liest alle Laufwerke aus und fügst sie der TreeView hinzu. Gleichzeitig fügst du jedem Laufwerks-Knoten in der Tree View einen Fake-Subknoten hinzu (am besten eine eigene Klasse).
Dieser Fake-Subknoten bewirkt, dass bei jedem Laufwerk ein Plus hinzugefügt wird.

Wenn man dann auf ein Laufwerk klickt, wird BeforeExpand ausgelöst. Dort überprüft man, ob der Knoten als einzigen Subknoten den Fake-Node hat.

Wenn ja:
Fake Node löschen, Subordner des Laufwerkes/Ordners auslesen, und als TreeView Node dem gedrückten Node hinzufügen.

Jedem hinzugefügtem Ordner fügst du wieder den Fake-Node hinzu, so dass jeder Ordner ein Plus zeichen hat.

Dies nennt man auf TreeView 'On Demand', evt. danach suchen.

29.10.2006 - 14:05 Uhr

Hallo,
am besten Random nur einmal initialisieren, und nicht jedes mal neu.
Dann passiert das auch nicht mehr

28.10.2006 - 19:04 Uhr

Hallo,
noch ein intressanter Artikel dazu:
http://www.codeproject.com/csharp/BigInteger.asp

26.10.2006 - 15:09 Uhr

Hallo,
@sheitman: Eine Klasse für C# kenn ich direkt nicht.

Aber unter PHP gibt es eine Lib, die sich bcmath nennt:
http://de.php.net/manual/de/ref.bc.php

Solche Libs gibt es bestimmt auch für C#, sonst kann man den sich ja auch den PHP Source Code runterladen, und die Library dort "extrahieren", und für seine Bedürfnisse umschreiben.
Steht ja unter LGPL.

25.10.2006 - 19:59 Uhr

Hallo,
hier ein guter Artikel über String Matching:
http://www.pronix.de/pronix-836.html

Zwar in C, allerdings dennoch intressant.

Dann musst du auf deine Datei nacheinander zugreifen.

Also:
Lese die ersten 1000 Bytes ein, und überprüfe ob die Byte-Folge darin enthalten ist.

Wenn nicht:
Nächsten 1000 Bytes einlesen, und weiter prüfen.

25.10.2006 - 19:51 Uhr

Hallo,
also entweder es per Hand zeichnen, oder per Visual Studio schon mal ein Interface erstellen. Wenn du schon weißt, wie das Programm mal aussehen soll, kannst du ja schon komplett erstellen per Visual Studio, und die Funktion hinter den Schaltfächen erst später implementieren.

25.10.2006 - 17:54 Uhr

Hallo,
alternativ kannst du auch Strings verwenden.

Es gibt diverse Klassen, die schnell mit Strings rechnen können, wobei man beliebig große Zahlen mit beliebig großer Genauigkeit rechnen kann.
Diese Klassen sind auch noch recht schnell. Immer wenn du SSL verwendest, werden mit Zahlen im Maßstab 10^300 (300 Stellen) oder größer gerechnet, und zwar auf die letze Zahl genau.

(Beliebig Groß: Je nach Platz auf dem Heap)

21.10.2006 - 18:28 Uhr

Hallo,
notfalls müsstest du daraus zwei Blöcke machen:


if(true) 
{
  int x = 0;
  //...
}

if(true)
{
  string x = "...";
}

Allerdings würde das zu einem sehr unübersichtlichem Code führen, genauso wenn man für einen Variablen Namen zwei verschiedene Typen verwenden.

Also, verwende 2 Variablen.

19.10.2006 - 18:16 Uhr

Hallo,
ich verwende eine RTF-Textbox als "Log-Box". Sprich eine Socket-Klasse löst immer ein Event aus, wenn dieses Daten empfängt oder sendet.
In der Log-Box soll dann angezeigt werden, welche Daten gesendet, bzw. empfangen wurden.

Jetzt gibt es verschiedene Arten von Meldungen, z.B. Warnings, Errors etc. Diese werden verschiedenen farbig angezeigt.

Das Problem ist jetzt, dass diese RTF-Box sehr sehr langsam ist, also es dauert sehr lange, bis das Programm alle Nachrichten der Socket-Klasse in der Textbox angezeigt hat.

Ich verarbeite das Event, einer neuen Nachricht seitens der Socket-Class, so:


 private void WriteRtfLog(LoggerEventArgs e)
        {
            if(this.InvokeRequired)
            {
                WriteRtfLogCallback d = new WriteRtfLogCallback(WriteRtfLog);

                try
                {
                    this.Invoke(d, e);
                }
                catch { }
            }
            else
            {
                int oldLength = rtfLog.Text.Length;                               
                
                //Nachricht und Zeilenumbruch anhängen
                rtfLog.AppendText(e.Message + "\r\n");


                //Wenn die Meldung von der Stufe Error, Info oder Warnung ist, anders farbig makieren
                if(e.Level == Level.Error || e.Level == Level.Info || e.Level == Level.Warn)
                {
                    rtfLog.SelectionStart = oldLength;
                    rtfLog.SelectionLength = e.Message.Length;

                    //Zeile umfärben
                    if(e.Level == Level.Error)
                        rtfLog.SelectionColor = Color.Red;
                    else if(e.Level == Level.Info)
                        rtfLog.SelectionColor = Color.Green;
                    else if(e.Level == Level.Warn)
                        rtfLog.SelectionColor = Color.Olive;
                }


                //Bis zum Ende der Box scrollen
                rtfLog.SelectionStart = rtfLog.Text.Length;
                rtfLog.ScrollToCaret();
            }
        }

Wenn die Socket-Class z.B. nur 1 Sekunde braucht, um einen Datenaustausch mit dem Server zu vollführen, so braucht das Programm ~8 Sekunden, bis die gesendeten & empfangenen Befehle in der RTF-Textbox auftauchen.

Kann ich diesen Abschnitt irgendwie optimieren?

05.10.2006 - 17:50 Uhr

Hallo,

Original von dechavue
da hast du 8Digitale Ausgänge, 5 Digitale Eingänge

hmm benutzt man eine serielle Schnittstelle (RS-232), so sieht es dort ähnlich aus, hat man auch die entsprechenden digitalen Ausgänge und Eingänge, sowie Pins die angeben, ob ein Eingang seit dem letzen Lesen seinen Wert geändert hat.

Und das beste daran ist: Jeder hat wohl ein altes serielles Kabel rumliegen, und .NET bietet direkt eine Schnittstelle, womit man die einzelnen Pins aktivieren, bzw. deaktivieren kann. Eigentlich relativ konfortabel damit, möchte man einfache Bauteile an, bzw. ausschalten (Spannung aus, an), oder bestimmte Werte überprüfen (Taster gedrückt, nicht gedrückt).

Also muss du gar nicht auf einen teuren USB Kontroller unbedingt umsteigen.

05.10.2006 - 16:36 Uhr

Hallo,
wenn du den parallel Port verwendest, oder den Serial-Port, dann kannst du direkt per Funktionsaufruf festlegen, auf welchen Pins Spannung liegen soll.
Außerdem kannst du per Funktionsaufruf auch dann auslesen, auf welchen Pins Spannung ist (Eingang).

So kannst du also direkt an ein parallel Port Kabel z.B. LEDs anschließen, und mittels Funktionsaufruf steuern, welche LEDs leuchten sollen, in dem du auf die Pins Spannung legst.

Gute Seite dazu:
http://www.codeproject.com/csharp/csppleds.asp

04.10.2006 - 16:27 Uhr

Hallo,
also ich kenne die inpout32.dll nur für das Ansprechen von Port am PC, z.B. des paralell Ports.

Die Dll hat nur die beiden Funktionen 'int Inp32(int port);' und 'void Oup32(int port, int value);', sofern ich da richtig informiert bins.

Kann es sein, dass du evt. etwas ganz anderes meinst?

26.09.2006 - 20:26 Uhr

Hallo,

Ich hab echt gerade keinen durchblick wie ich das machen soll

Brauchst du auch gar nicht, denn wie jedes andere große DBMS ist MySQL Multi-User 'sicher', welches all die Effekte, die du beschreibst, verhindert (bzw. man diese leicht verhindern kann), sofern man sich an ein paar Grundregeln hält.

Bei der Kenn-Nummer kann man z.B. als Eigenschaft 'auto_increment' setzen.
Beim Editieren ist es evt. etwas schwerer, da du ja den Text oft zwischenspeicherst, z.B. in einer Textbox, und diesen Text dann abspeicherst.
Der kann dann natürlich von einer älteren Zwischenablage überschrieben werden.

z.B. bei Access kannst du verschiedene Zugriffs-Modi für Tabelle & Datensätze setzen.
Zum Beispiel das, wenn du Datensatz xyz bearbeitest, diesen zwar jeder Lesen darf, aber keiner verändern darf, solange bis du den Schutz aufhebst.

Bei MySQL gibt es soetwas auch, schau mal hier:
http://dev.mysql.com/doc/refman/4.0/de/lock-tables.html

Aber das MySQL ja schon Multi-User 'sicher' ist

PS: Transaction spielen bei euch auch eine große Rolle.

22.09.2006 - 18:44 Uhr

Hallo,
'string user1'

Sofern ich mich nicht irre, ist der default Zugriffsparamter private.
Des wegen entweder:
public string user1;

schreiben, oder eine Eigenschaft/Property für user1 erstellen.

22.09.2006 - 18:17 Uhr

Hallo,
wo und wie hast du 'user' denn deklariert?
Und was ist 'user'?? Ein string, ein Textfeld?

22.09.2006 - 18:15 Uhr

Hallo,
man benötigt mit Visual Studio C# 2005 Express allerdings keine Bücher.

Das ist alle so ein Art Baukasten. Man zieht aus einer Toolbox seine Controls, wie Buttons, Labels, Textfelder etc., auf das Form (dein Programm).
Und die Eigenschaften kann man auch direkt auf der Oberfläche editieren.

Nach ein paar Minuten kommt man damit zurecht, und kann supter Anwendungen damit erstellen, zumindest theoretisch 😉

21.09.2006 - 18:27 Uhr

Hallo,
naja ich würde folgende Regel in etwas befolgen:

Abstrakte Klasse: Jede Unterklasse unterscheidet sich von der Eltern-Klasse nur in wenigen, bestimmten Funktionen.
Des Weiteren sollte die abstrakte Eltern Klasse bereits Code enthalten, die für alle Kinder gleich sind.

Interface: Wenn es keine gemeinsame Codebasis für die Kinder gibt.

Man muss überlegen, wozu man so ein Interface verwenden möchte. Wenn der Code, der hinter einem Interface sehr unterschiedlich seien kann, wie z.B. bei IEnumerable, dann lieber ein Interface.

Hast du aber eine Elternklasse, die Dateien vom Computer A zu Computer B transferieren, und sich nur der Down/Upload unterscheidet (oder evt. der Transportweg), dann lieber eine abstrakte Klasse wählen, und den konkreten Dateitransfer in den Kinderklassen realisieren.

Die Methode der Delegation ist auch eine Möglichkeit, seine Klasse recht leicht zu erweiteren.

21.09.2006 - 17:02 Uhr

Hallo,

Assemblies

Übersetzte Programmklassen werden als ausführbare Programme in so genannten Assemblies zusammengefasst und bereitgestellt (vergleichbar mit Jar-Dateien in Java). Diese haben typischerweise die altbekannten Endungen .exe oder .dll, sind intern jedoch völlig anders strukturiert.


>

Eigentlich schon zu verstehen der Abschnitt 😉

20.09.2006 - 21:13 Uhr

Hallo,
cool danke, habs hinbekommen.

Hab es so umgeschrieben:


 foreach(Type t in this.GetType().Assembly.GetTypes())
            {
                if(!t.IsAbstract && ContainsInterface(typeof(IKindInterface), t.GetInterfaces()))
                {                   
                   
                     
                    try
                    {
                        IKindInterfacenewItem = (IKindInterface)Activator.CreateInstance(t);

                        if(!items.ContainsKey(newItem.SupportedExceptionType))
                            items.Add(newItem.SupportedExceptionType, newItem);
                    }
                    catch(Exception e)
                    {
                        MessageBox.Show("Modul konnte nicht geladen werden: " + e.Message);
                    }                    
                }              
            }

20.09.2006 - 20:25 Uhr

Hallo,
@marsgk: Damit wäre aber das eigentlich Problem nicht behoben.

@rockthecity: Das Problem beim Factory Pattern ist, dass eine andere Klasse wissen muss, welche Module es gibt. Allerdings sollen sich die Module/Kindsklassen von selber registieren.

Evt. wird es so etwas klarer:


public class Eltern
{
   public static readonly Instanz = new Eltern();

   //Die Kinder, die die Elternklasse hat
   private List<Eltern> Liste_Der_Kinder = new List<Eltern>();

   protected void Register(Eltern neuesKind)
   {
      Liste_Der_Kinder.Add(neuesKind);
   }

   public void Error(Exception e)
   {
      foreach(Eltern kind in Liste_Der_Kinder)
     {
         if(kind.SupportedType == typeof(e))
         {
            kind.HandleException(e);
            break;
         }        
     }
   }

  //HandleException muss überschrieben werden
}

public class KindFürSocketException : Eltern
{
   private static readonly Instanz = new KindFürSocketException(); //Dies soll sofort beim Programmstart aufgerufen, und nicht erst, wenn es benötigt wird.


   public Type SupportedType 
   {
      get { return typeof(SocketException); }
   }
 
   private KindFürSocketException ()
   {
   Eltern.Instanz.Register(this);  
   }

   public override void HandleException(Exception e)
   {
   //Was tun bei einem SocketException
   }
}

public class KindNullReferenceException : Eltern
{
   private static readonly Instanz = new KindNullReferenceException(); //Dies soll sofort beim Programmstart aufgerufen, und nicht erst, wenn es benötigt wird.


   public Type SupportedType 
   {
      get { return typeof(NullReferenceException); }
   }
 
   private KindNullReferenceException()
   {
   Eltern.Instanz.Register(this);  
   }

   public override void HandleException(Exception e)
   {
   //Was tun bei einem NullReference
   }
}

Wenn ich jetzt der Eltern-Klasse z.B. eine SocketException übergebe, dann schaut es nach, ob eines der Kinder diese Exception (SocketException) unterstützt.
Hier würde es dann also eine Methode von KindFürSocketException() aufrufen.

So jetzt möchte ich das ganze Modular erweiteren. Möchte ich jetzt z.B. noch DivisionDurchNull auffangen, erstelle ich einfach eine Klasse die von Eltern erbt, und als SupportedType die 'DivisionDurchNullException' angibt.

Das Problem was ich bisher habe: Die Kinder registieren sich nicht selbstständig bei der Eltern Klasse (bzw. auch bei keiner anderen Klasse), denn die Static-Variable wird ja erst initialisiert, wenn ich diese aufrufe (und nicht zu Programmstart).

Dadurch, dass die Static-Var. nicht initialisiert wird, wird das Kind auch nicht bei der Eltern-Klasse registiert.

Eine Möglichkeit wäre jetzt, am Anfang jede Kind-Klasse per Hand zu initialisieren, allerdings könnte man es so nicht mehr so leicht erweiteren.

Des wegen suche ich folgende Möglichkeit:

  1. Eine Variable, die zu Programmstart initialisiert wird, und nicht wenn man sie zum ersten mal benutzt. Wobei diese Variable/Methode in der Kindklasse, bzw. in der .cs Datei der Kindklasse liegen müsste.

Oder
2. Eine Methode, um alle Klasse eines Namespaces auszulesen, zu überprüfen ob sie von einer bestimmten Klasse geerbt haben (oder ein Interface implementieren), und dann deren Konstruktor aufrufen.
Evt. funktioniert das ja.

Ich hoffe man kann es verstehe ^^

MFG

20.09.2006 - 17:32 Uhr

Hallo,
@rockthecity:
Das bringt nichts. Nach außen soll man nur die Elternklasse sehen können.

Die Elternklasse selber besitzt aber Kindern, dich sich selber bei ihr registiert haben (also die Kinder bei den Eltern).

Die Kinder an sich sollte man wenn möglich nicht zu gesicht bekommen.

Also etwa so:

public class Eltern
{
   public static readonly Instanz = new Eltern();

   protected void Register(Eltern neuesKind)
   {
      Liste_Der_Kinder.Add(neuesKind);
   }

   public void EineMethode()
   {
      foreach(Eltern kind in Liste_Der_Kinder)
     {
      //....
     }
   }
}

public class Kind : Eltern
{
   private static readonly Instanz = new Kind(); //Dies soll sofort beim Programmstart aufgerufen, und nicht erst, wenn es benötigt wird. 

   private void Kind()
   {
   Eltern.Instanz.Register(this);  
   }
}

@herbivore:
Naja ich möchte eigentlich, dass es nur ein Objekt von 'Eltern' gibt.

20.09.2006 - 16:43 Uhr

Hallo,
ich habe eine Singleton Klasse, diese möchte ich mittels Vererbung modular erweitern.

Also ich habe mir das so vorgestellt:
Die Elternklasse (Singleton) ist dafür gedacht, Fehler abzufangen. Für jede Exception-Art (z.B. SocketException) wollte ich nun eine Subklasse schreiben.

Der Client/User übergibt der Elternklasse die Exception, ohne auf den Typ der Exception zu achten.
Die Elternklasse schaut dann, ob eine Unterklasse für die Art der Exception vorhanden ist. Wenn ja, wird in der Unterklasse eine Methode aufgerufen, welche die Fehlerbehandlung übernimmt.

Um herrauszufinden, welche Kinder die Elternklasse hat, gibt es in der Elternklasse die Methode 'Register'. Die Kinder rufen diese Methode auf und übergeben ihr den Typ der behandelten Exception (z.B. typeof(SocketException)), sowie eine Instanz von sich selber.

Das Problem liegt jetzt beim registieren. Wie schaffe ich es, dass sich die Kinder von selber registieren.
Verwende ich eine static-Variable (= new KindObjekt()), dann wird diese erst initialisiert, wenn ich sie zuerst verwende.
Allerdings möchte ich die gesamte Struktor nach außen unsichtbar halten. Der Client/User soll später nur über die Elternklasse arbeiten.

Hat jmd. eine Idee, wie ich das realisieren kann, so dass das alles modular bleibt?