Laden...
B
bluedragon myCSharp.de - Member
Nordrheinwestfalen Dabei seit 11.06.2008 101 Beiträge
Benutzerbeschreibung
Sei schlau, bleib dumm !

Forenbeiträge von bluedragon Ingesamt 101 Beiträge

26.09.2008 - 17:07 Uhr

Probiers mal nicht mit do...while(eingabe != "logout") sondern mit while(eingabe != "logout")

Was für ein Quatsch, eine Do-While-Schleife ist hier vollkommen angebracht, da man ja mindestens einmal eine Eingabe tätigen muss, damit der String "logout" enthalten kann.
Am Ende ist es sogar egal, da der String beim Starten wohl kaum "logout" enthält 😉

@Orca, lern bitte deinen Code richtig eizurücken und lass nicht soviele Leerzeilen, das macht den Code nur zu unübersichtlicht. (Leerzeilen im gewissen Maße sind vollkommen richtig !)

Und bitte benutzt diese Methode der Klasse Double zum konvertieren: Double.TryParse

mfg
blue

24.08.2008 - 02:03 Uhr

Ich mag zwar selber keine Doppelposts, aber kann mir denn niemand sagen warum der Client keine Daten zurückerhält ?

mfg
bluedragon

23.08.2008 - 15:51 Uhr

Die Eigenschaft RemoteEndPoint des Clients gibts seine öffentliche IP an.


//Den Socket server Kram
Socket client = server.Accept();
Console.Write("Client IP und Port" + client.RemoteEndPoint );

mfg
bluedragon

23.08.2008 - 15:43 Uhr

Danke, daran hab ich natürlich nicht gedacht 😁 Da erwähn ich den Router schon und wie er funktioniert, aber bin dann doch zu doof die Klobrille (siehe oben) hochzuheben 😉

So die Daten werden vom Client übertragen (hab dem nen Kumpel gegeben), am Server die IP, Port und Anzahl der erhaltenen Bytes angezeigt und dann auch zurück geschickt. Soll halt nur nen Echo-Server zu Testzwecken sein. Dann steht bei mir (Server), das die erhaltenen Bytes erfolgreich zurückgesendet wurden. Direkt danach, steht bei meinem Kumpel (Client), dass 0 Bytes erhalten wurden und ein Text mit leerem Inhalt zustande kahm 🙁
Woran kann das liegen ? Code könnte ich auch noch posten, aber ich denke nicht das es an ihm liegt, denn Lokal klappt alles wunderbar.

mfg
bluedragon

23.08.2008 - 14:28 Uhr

Hoi Leute,
ich bin jetzt seid 2 Tagen am googlen, wie ich ein Anwendung mit Sockets übers Internet am laufen bekomme. Aber das msdn Magazin und weitere Seite haben mir nicht geholfen. Egal welsche Stichwörter ich eingebe, es kommt immer nur was mit lokaler Socket Nutzung oder wie man abfragen kann, ob man mit dem Internet verbunden ist.
Ich habe mir auch schon selber Gedanken gemacht, aber ich hoffe das es leichtere Möglichkeiten gibt als mir auf z.B. dyndns.org einen Eintrag zu erstellen.
Ich ging nämlich davon aus (wegen der Infos, aus den Tutorials), dass es reicht wenn ich die öffenteliche IP des Zielrechners angebe (sprich die IP des Routers) und den Port. Laut Tut, wird dann der Router angesteuert und der leitet (je nach Porteingabe) dann den Socket weiter zu einem Lokalen rechner hinter dem Router, der diesen Port freigibt.
Naja so hab ich das verstanden, aber anscheinend falsch, sonst würde es ja gehen 😉
Wäre also nett wenn mir jemand, hilfreiche Links schicken könnte oder es mir bitte erklärt.
Kann ja auch sein das es so simpel ist, wie auf Klo zu gehen, und ich bin nur zu doof die Klobrille anzuheben =)

mfg
bluedragon

22.08.2008 - 17:18 Uhr

Ich denke eine Reinitialisierung dürfte reichen.
Ansonsten eine neue Klasse schreiben den SmtpClient vererben, dann die OnSendComplete()-Methode der Basisklasse überschreiben und Dispose einfügen, dadurch wird die Klasse automatisch vom GC entfernt.
ODER nen using-Block in die Endlosschleife einfügen.
Eigentlich dürfte "jetzt" die Session weg sein.
Hier schau mal, ungetestet und da ich auch nicht weißt, ob meine Vermutung überhaupt richtig ist, musst du es testen. Kann dir also nicht sagen obs klappt 😉


class SmtpClients : SmtpClient , IDisposable 
{ 
  private bool disposed = false;
  
  override void OnSendCompleted()
  {
   base.OnSendCompleted();
   Dispose();
   }

  public void Dispose() 
  { 
      if(!this.disposed) 
      { 
         disposed = true;
         GC.SuppressFinalize(this); 
    } 
  }

  ~SmtpClients () 
  { 
    Dispose(); 
  } 
}

Bin in C# verhältnissmässig neu, vllt kann einer der "hohen Tiere" dir nen Tipp geben.

mfg
bluedragon

22.08.2008 - 14:23 Uhr

Ich weiß nicht wie das geht, aber du könntest einfach einen Testlauf machen. Das frisst zwar (wiedermal) imens Traffic, aber du müsstest ihn nur einmal machen. Einfach ne Endlosschleife, mit Connect --> Mail versenden --> Disconnect --> Attachment vergrößern --> zurück zum Anfang. Wenn dann eine die Exception kommt, lass dir die Attachment größe ausgeben, und schon müsstest du es wissen.
Hab ich zwar noch nie probiert, aber müsste gehen.

mfg
bluedragon

21.08.2008 - 16:24 Uhr

Hallo Masterchief,

bitte keine Doppelposts, vor allem nicht, wenn dein letzter Beitrag erst 5 Stunden her ist.

weiß denn keiner wie das geht?

Bitte alle Beiträge ++genau ++ lesen.
Frisch hat bereits geschrieben wie:

Request zum holen und Response zum zurück senden.

Und sieh mal hier nach Gewusst wie: Senden von Daten mit der WebRequest-Klasse

mfg
bluedragon

20.08.2008 - 18:41 Uhr

Hallo macke_a,

einen Thread beenden kannst du mit Thread.Suspend(), ist jedoch veraltet.

Aber hier mal ein Beispiel wie du dne Thread indirekt immer neu mit Daten füttern könntest.


class Program
class Program
{
    private static string m_info = "hallo";
    private static string m_info2 = "tschüss";
    
    static void Main(string[] args)
    {
        Thread t = new Thread(new ThreadStart(rekursiv));
        t.Start();
        Thread.Sleep(1000); //lässt den Hauptprozess einschlafen, was eigentlich nicht so günstig ist, aber der Thread t läuft weiter
        m_info = "neee";
        m_info2 = "doch !";
        Thread.Sleep(1000);

        Console.ReadLine();

    }

    private static void rekursiv()
    {
        string info;
        string info2;
        int i = 0;
        for (int j = 0; j < 10; j++ )
        {
            info = m_info;
            info2 = m_info2;
            if (i == 0)
            {
                Console.WriteLine(info);
                i = 1;
            }
            else
            {
                Console.WriteLine(info2);
                i = 0;
            }
            Thread.Sleep(200); //lässt nur diesen Thread 200 Millisekunden schlafen
        }
    }
}


Ausgabe:

hallo
tschüss
hallo
tschüss
hallo
neee
doch
neee
doch
neee

Ich weiß nicht ob es vielleicht rekursive Threads gibts. Aber Sinn machen würden es auch keinen, da man einen Thread mit keine Paramtern versehen kann.

mfg bluedragon

20.08.2008 - 18:25 Uhr

Hallo qwer,

wenn ihr keinen Zugriff auf die Einstellungen des Servers habt, dann bleibt das die einzige Möglichkeit. Ich denke Smtp.Disconnect() und dann wieder Connecten, dürfte ausreichen. Das frisst zwar Traffic, aber es müsste gehen !

mfg
bluedragon

20.08.2008 - 16:54 Uhr

Warum fragst du nicht einfach direkt über die Eigenschaft Socket.Connected ab, ob noch eine Verbindung steht ?

mfg
bluedragon

19.08.2008 - 23:43 Uhr

Hallo Bit2_Gosu:



Regex regex = new Regex(@"^((\d+x)\z)|((\d+/\d+)\z)$");


ungetestet.
Aber schau mal hier nach, das Forum hat ein schönes Tut zum Thema Regex: klick mich

*EDIT*
Was mir gerade noch eingefallen ist, lässt du in deinem MatchEvaluator erst das "geteilt" oder erst das "mal" ersetzten ? Wenn du erst das "geteilt" ersetzt, dann is klar, dass er das "mal" nicht mehr ersetzt. Denn durch den Ersatzt steht dort nichtmehr "3x" sondern "3.0x" !

mfg
bluedragon

19.08.2008 - 23:32 Uhr

Achso, also sind alle Daten übertragen und erhalten, nur der Thread ist sozusagen eingefroren.
Danke jetzt hab ichs verstanden.

Ich hatte die Receive()-Methode immer so verstanden, dass halt geschaut wird, ob Daten um TCP Puffer vorhanden sind, diese empfangen werden und immer ein int-Wert als Rückgabetyp, je nach Anzahl an erhaltenen Daten, zurückgegeben wird. Ist der Wert 0, so gibt es keine Daten und die Schleife wird beendet. Aber wenn Receive() selbst intern auf Daten wartet, bis es weiterläuft, dann is mir alles klar =)

Naja aber habe ja dank dir, jetzt die Lösung.
Kann also geclosed werden.

mfg
bluedragon

19.08.2008 - 17:21 Uhr

Leider ergibt es für mich keinen Sinn, dass es vorher nicht funktioniert hat, aber nun funktionierst:


while (clientSocket.Available > 0)
{
          bytesRcvd = clientSocket.Receive(rcvBuffer, 0, rcvBuffer.Length, SocketFlags.None);
          totalBytesRcvd += bytesRcvd;
          output += Encoding.ASCII.GetString(rcvBuffer, 0, bytesRcvd);
}

Denn die while-Schleife läuft halt solange, bis bytesRcvd quasi 0 ist (oder kleiner), das passiert ja nur, wenn keine Dateien mehr empfangen werden. Durch die Parameter von Receive sag ich der Methode, dass sie doch nur rcvBuffer.Length (16) Dateien empfangen soll, ergo es sind bei z.B. 30 übertragenen Daten noch 14 übrig.

Aber naja, danke für Antworten und danke wolpertinger, klappt nun endlich =)

mfg
bluedragon

19.08.2008 - 14:20 Uhr

Moin Leute, ich hatte schon einen Thread zu nem Datenübertragungsproblem, aber der Thread hier zielt auf eine konkrete Frage hinaus und nicht auf ein direktes Problem (das Problem im andern Thread ist gelöst d.h. neuer Thread).

Also ich habe einen Echo-Server, der immer brav Daten, die er erhält, zurückschickt.
Der funktioniert wunderbar.
Dann hab ich ein Client, der eben Daten hinschickt. Dort ist ein Teil im Code, der so nicht funktioniert (keine Daten zurückerhält)


string output = "";
byte[] bytesSent = Encoding.ASCII.GetBytes(startParam);

try
{               
    clientSocket.Send(bytesSent);

    int totalBytesRcvd = 0;
    byte[] rcvBuffer = new byte[16];
    int bytesRcvd = 0;

    while ((bytesRcvd = clientSocket.Receive(rcvBuffer, 0, rcvBuffer.Length, SocketFlags.None)) > 0)
    {
        totalBytesRcvd += bytesRcvd;
        output += Encoding.ASCII.GetString(rcvBuffer);
    }
}

catch (SocketException se)
{
    Console.WriteLine(se.Source + ": " + se.Message + "\n");
}

hingegen so aber schon (sprich der Mittelteil ist nur anders)


string output = "";
byte[] bytesSent = Encoding.ASCII.GetBytes(startParam);

try
{               
    clientSocket.Send(bytesSent);

    int totalBytesRcvd = 0;
    byte[] rcvBuffer = new byte[16];

    totalBytesRcvd += clientSocket.Receive(rcvBuffer);
    output += Encoding.ASCII.GetString(rcvBuffer);

    return ("Es wurden " + totalBytesRcvd.ToString() + " bytes erhalten, folgender text kam zu stande:\n" + output);
}
catch (SocketException se)
{
    Console.WriteLine(se.Source + ": " + se.Message + "\n");
    return ("Datenübertragung fehlgeschlagen !");
} 

Der erste Code kommt nicht bis zum return (das ganze steht in einer Methode), liefert aber auch keine Fehlermeldung/Exception.
Der zweite Code schon, dort funktioniert alles wunderbar.

Hier meine Frage: Wieso ? =)

mfg
bluedragon

19.08.2008 - 00:11 Uhr

Wie ich weiter oben schon erwähnte, werden ja bei einem Prozessor, mit nur einem Kern, selbst bei der Thread-Programmierung alle Prozesse in einer Warteschleife gelegt. Nur für den Benutzter allein sieht es so aus, als würde der Prozessor mehrere Dinge gleichzeitig erledingen. D.h. stellt sich die Frage für was Threads denn wirklich sinnvoll erscheinen. Es gibt da eigentlich keine Rezept für. Aber von meiner Sicht aus sind Threads für Dinge wie: Telegramme erhalten, Clientanfragen - bei einem Server - erwarten, und so weiter.
Ein Thread ist letzenendes nur eine Abzweigung wo der Code sich nur für den Benutzter "trennt" und parallel läuft, meines erachtens (kann mich auch irren, solange code ich in C# noch nicht).

Einzige Ausnahmen sind Prozessoren mit mehr als einem Kern, denn die behandeln wirklich parallel mehrere Prozesse.

Ist es denn sinnvoll die Programmteile in mehrere Threads zu fassen?

Nein. Nur wenn es wirklich nötig ist ! Wenn du dir nicht sicher bist, dann lieber nachfragen.

Muss ich von Grund auf diese Beziehung einhalten?

Was für eine Beziehung meinst du ? Wenn sich das auf "alle Programmteile in Threads" bezieht, dann nein, weil siehe oben 😉

Ohne die Threadprogrammierung werde ich wohl nicht mehr auskommen, oder seht ihr da andere Möglichkeiten!?

Das kommt ganz auf die Situation an. Wenn du z.B. einen Server für einen Chat programmierst, der immer wieder damit beschäftig ist, Anfragen zu akzeptieren, dann würde es den Code natürlich aufhalten, denn die Methode Accept wartet bis eine Verbindungsanfrage gesendet wurde, vorher läuft der Code nicht weiter. So etwas Nicht in einem Thread abzulegen wäre fatal !

So gesehn brauchst du Threads, nur für Dinge, die deinen restlichen Code einfrieren würden.

mfg
bluedragon

18.08.2008 - 18:11 Uhr

Ne ich hab den Code nicht 1 zu 1 gepostet und noch nach dem posten ein paar Dinge geändert ^^ Bei mir stehts so


class TcpClient
    {
        static void Main(string[] args)
        {
            new TcpClient(args);
        }

        public TcpClient(string[] args)
        {
        }
}

Das war nur zu Testzwecken, aber werds mir merken ;=)

Naja aber das ändert nichts daran, warum es vorher nicht ging, kann mir da noch jemand helfen ?

mfg
blue

18.08.2008 - 00:25 Uhr

Hallo Joey83,

ja es ist sehr wohl möglich 🙂

SDL: http://cs-sdl.sourceforge.net/index.php/Main_Page
OpenGL & DirectX: http://public.tfh-berlin.de/~miszalok/Lectures/L05_OpenGL_DirectX/OGL_DX_deutsch.htm

mfg
bluedragon

18.08.2008 - 00:06 Uhr

So habe das Problem nun selber behoben.
Nachdem ich gesehen hatte, dass im Code vom Server ein Tippfehler meinerseits war (hab den Code aus dem Tutorial nicht copy&paste, sondern abgetippt), gings zwar immer noch nicht, aber es kam keine Fehlermeldung mehr (Vorteil oder Nachteil =))
Beim debuggen ist der Debugger sowohl beim Server, als auch beim Client immer in der while-Schleife zum Daten erhalten geblieben und hat dann ohne jegliche Fehlermeldung einfach die Schleife beendet. Nach einigen missglückten Versuchen, die Schleife hinzubiegen, habe ich dann beim Client, einfach mal die Schleife weggelassen und ganz simpel mit "einweg"-Receive die Daten gespeichert. Nun klappts. Nur Gott weiß wieso 😉

Code vorher(keine Fehlermeldung, aber auch keine Ausgabe):


private static string SendReceive(string startParam, Socket clientSocket)
{

    int totalBytesRcvd = 0;
    byte[] rcvBuffer = new byte[1024];
    int bytesRcvd; ;
    string output = "";

    try
    {
        byte[] bytesSent = Encoding.ASCII.GetBytes(startParam);
        clientSocket.Send(bytesSent);

        while ((bytesRcvd = clientSocket.Receive(rcvBuffer, totalBytesRcvd, rcvBuffer.Length, SocketFlags.None)) > 0)
        {
            output += Encoding.ASCII.GetString(rcvBuffer, totalBytesRcvd, bytesRcvd);
            totalBytesRcvd += bytesRcvd;
        }

        return ("Es wurden " + totalBytesRcvd.ToString() + " bytes erhalten, folgender text kam zu stande:\n" + output);
    }
    catch (SocketException se)
    {
        Console.WriteLine(se.Source + ": " + se.Message + "\n");
        return ("Datenübertragung fehlgeschlagen !");
    }
}

Code nachher(alles geht):


private static string SendReceive(string startParam, Socket clientSocket)
{
    int totalBytesRcvd = 0;
    string output = "";

    try
    {
        byte[] bytesSent = Encoding.ASCII.GetBytes(startParam);
        clientSocket.Send(bytesSent);

        byte[] rcvBuffer = new byte[128];

        totalBytesRcvd += clientSocket.Receive(rcvBuffer);
        output += Encoding.ASCII.GetString(rcvBuffer);

        return ("Es wurden " + totalBytesRcvd.ToString() + " bytes erhalten, folgender text kam zu stande:\n" + output);
    }
    catch (SocketException se)
    {
        Console.WriteLine(se.Source + ": " + se.Message + "\n");
        return ("Datenübertragung fehlgeschlagen !");
    }       
}

Ich weiß, eigentlich kann das Thema geschlossen werden, da mein Problem behoben ist, aber wenn jemand mir den gefallen tun würde und mir sagt, warum der erste Code nicht funktioniert hat, würde mich das Wissenstechnisch echt weiterbringen ! Denn begreifen tu ich es einfach immernoch nicht 🙁

mfg
bluedragon

17.08.2008 - 21:20 Uhr

Ach quatsch, habs auch als Scherz aufgefasst 8)

zu 1.) Sowohl n (nicht N), x und a müssen variable sein, sonst würde der Aufruf der Methode, nur eine Konstante zurückgeben.

zu 2. Teil 1) Ich könnte jetzt sagen, dass wir T dann einfach weglassen, aber ich glaube, das ist nicht im Sinne der Mathematiker. Nur wenn du dir sicher bist =)
Ich hab mal die ganze PDF überflogen und da kommt nirgenswo mehr T, als Exponent, vor. Nur in einem anderen Zusammenhang.

zu 2. Teil 2) Das ist nicht ganz richtig, a,b,c.. sind keine Koeffizienten, sondern a0,...,aN-1 sind Indezes, was auch erklärt, warum N gerundert wird (siehe weiter oben in der PDF).

zu 3.) Wenn wir das noch gelöst bekämen, wäre der Rest auch nur noch schreibkram.
Das würde ja eigetnlich keinen Sinn machen. Alle Komplexen Zahlen mit einem Faktor zu multiplizieren, dadurch würde ein unendlich großer Raum an Zahlen in R entstehen 8o

Zusätzlich frage ich mich gerade noch, ob die Aussage wie C (mit den Kringeln) definiert wird, Sinn ergibt. Oder mein English versagt mal wieder gg "C ist die 2*N-te Einheitswurzel in R mit CN/P = x" ??
Das würde vorraussetzten (!) das man x kennt (siehe oben^^) oder es ergibt keinen Sinn, wie beispielsweise "z = z * i" oder so 🙂

mfg
bluedragon

17.08.2008 - 18:54 Uhr

Im Endeffekt, werden die Threads intern auch nur in eine Warteschleife gelegt, für den Benutzter sieht es nach aussen hin so aus, als ob beide Prozesse gleichzeitig behandelt werden. Aber in Wirkllichkeit werden sie auch nur immerwieder nacheinander behandelt.
Ich kenne deinen Code nicht und weiß nicht was du falsch oder richtig, gut oder schlecht in deiner Programmierstruktur machst. Viele Wege führen nach Rom 😉
Aber wenn du selber schon sagst, dass du den Code nur "einfach heruntergeschrieben" hast. Dann solltest du noch mal den Code neu schreiben oder modifizieren (nur wenn merkliche Performence-Probleme auftreten).

Achja und während du auf die Telegramme zugreifst, solltest du sie vorher noch mit lock sperren für die dauer der Behandlung, damit vermeidest du, dass während der Auswertung oder was auch immer du damit machst, die Endlosschleife im Thread, die Telegramme manipuliert.

mfg
bluedragon

17.08.2008 - 18:32 Uhr

Wie sollte dir jemand helfen können, wenn es keiner lesen kann =)
Bin zwar erst 17, aber nicht dumm 😉

Hab mir jetzt mal auf Wiki gut durchgelsen, was ein Ring ist (mir war vorher schon klar das es nicht die glitzerdinger für den Finger sind ^^).

War ja nicht wirklich schwer, Zitat:

  1. "Ein Ring ist eine algebraische Struktur, in der, ähnlich wie in den ganzen Zahlen Z, Addition und Multiplikation definiert und miteinander bezüglich Klammersetzung verträglich sind."

  2. "Eine Menge R mit zwei inneren binären Verknüpfungen „+“ und „ *“ auf R ist ein Ring, wenn gilt:
    *(R, + ) ist eine abelsche Gruppe, mit 0 als neutralem Element; die Multiplikation „“ ist assoziativ; *es gelten die Distributivgesetze, d. h. für alle a,b,c € R ist
    "a * (b+c) = a * b + a * c" und "(a+b) * c = a * c + b * c" .

    "

  3. "Bei einem kommutativen Ring ist auch die Multiplikation kommutativ. Mit kommutativen Ringen mit Eins beschäftigt sich die kommutative Algebra."

Die einzigen Fragen die sich mir noch Stellen wären:
Was ist T ?
Wird x und klein n auch im Parameter übergeben. Sprich sind variable ?

Die Definitionen von N und P stehen ja in der PDF weiter oben, hab ich aber eben erste gesehen ^^

mfg
bluedragon

17.08.2008 - 16:47 Uhr

Hallo Siassei,
also ich versuche mich seid ca 15 Minuten in den Algorythmus einzuarbeiten und hab ziehmlich schnell gemerkt, dass du dir da was ganz schön Großes vorgenommen hast ^^

Ich könnte dir vielleicht helfen, wenn du mir zu erst sagst, was die erforderlichen Inputs darstellen sollen. Kann leider nicht alle "entschlüsseln" 🙂 Was soll R darstellen ( alle reellen Zahlen, ich weiß nicht, das sieht eigentlich anders aus).
a wird wohl ein einfacher Array sein, nur was ist wiederum T.
Was ist das C mit dem kringel oben und unten, das andere C steht klarerweise für alle komplexen Zahlen.
N steht für eine beliebige Zahl ?
P = powers of 2. Mein English ist nicht so gut. Ist das nun eine quadratische Zahl (x²) oder eine Exponentielle Zahl zur Basis 2 (2x)

mfg
blue

17.08.2008 - 13:35 Uhr

Hallo Freecastle,

encodierst du das Objekt auch in ein byte-Array vor dem Datentransfer ?

mfg
blue

17.08.2008 - 13:24 Uhr

Halloe macke_a,

du hast ja selber schon das Wörtchen "Thread" erwähnt.
Threads sind für solche Dinge immer sehr sinnvoll, Beispiel:


class Navi
{
     public Navi ()
     {
          
          Thread t = new Thread(new ThreadStart(getTelegramm));
          //Navikram

          //Route berechnen Kram
     }

     protected void getTelegramm()
     {
          for(;;)
          {
               //Telegramme erhalten und so weiter
          }
     }

     public static void Main()
     {
           new Navi();
     }
}

17.08.2008 - 02:04 Uhr

So hab "ihn" fertig.
Siehet und staunet 😉


using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;  

namespace Taschenrechner
{
    class Taschenrechner
    {
        static void Main(string[] args)
        {
            new Taschenrechner();
        }

        public Taschenrechner()
        {
            int dran = 0;
            string eingabe, rechnung="+";
            double ergebnis = 0;

            Regex zahlenRegex = new Regex(@"^[0-9]*$");
            Regex zeichenRegex = new Regex(@"^(\+|\-|\*|\/)\z$");

            Console.WriteLine("Bitte geben sie abwechselnd eine Dezimalzahl (auch mehrere Ziffern) und einen Operator ein. \nNach eintippen der letzten Zahl, geben sie \"ende\" ein, um das Ergebnis zu erhalten.\n");

            do
            {
                if (dran == 0)
                {
                    do
                    {
                        Console.Write("Zahl:     ");
                        eingabe = Console.ReadLine();
                    }
                    while (eingabe.Equals(""));

                    if (zahlenRegex.IsMatch(eingabe))
                    {
                        if (rechnung.Substring(rechnung.Length - 1, 1).Equals("/") && eingabe.Equals("0"))
                            Console.WriteLine("Durch 0 teilen nicht möglich !");
                        else
                        {
                            rechnung += eingabe;
                            dran = 1;
                        }
                    }
                    else if (!eingabe.Equals(""))
                        Console.WriteLine("Ungültige Eingabe !!! Bitte geben sie eine Zahl ein !");
                }
                else
                {
                    do
                    {
                        Console.Write("Operator: ");
                        eingabe = Console.ReadLine();
                    }
                    while (eingabe.Equals(""));

                    if (eingabe.Equals("ende")) break;

                    if (zeichenRegex.IsMatch(eingabe))
                    {
                        rechnung += eingabe;
                        dran = 0;
                    }
                    else if (!eingabe.Equals(""))
                        Console.WriteLine("Ungültige Eingabe !!! Bitte geben sie eine Operator ein !");
                }
            }
            while (dran == 0 || !eingabe.Equals("ende"));

            ergebnis = Berechnen(rechnung);

            Console.WriteLine("\nErgebnis: " + ergebnis.ToString());

            Console.ReadLine();
        }

        private static double Berechnen(string eingabe)
        { 
            return Durchgehen(eingabe, '+') + Durchgehen(eingabe, '-');
        }

        
        private static double Durchgehen(string eingabe, char rOperator)
        {
            double ergebnis = 0;
            Regex erste, zweite;

            if(rOperator.Equals('+'))
            {
                erste = new Regex(@"\+[^(\+|\-)]*");
                zweite = new Regex(@"\+[0-9]*[(\/|\*)]");
            }
            else
            {
                erste = new Regex(@"\-[^(\+|\-)]*");
                zweite = new Regex(@"\-[0-9]*[(\/|\*)]");
            }

            MatchCollection durchgang = erste.Matches(eingabe);

            for (int i = 0; i < durchgang.Count; i++)
            {
                double zwichenErg = 0;
                bool ersteZahl = true;
                if (zweite.IsMatch(durchgang[i].Value))
                {
                    MatchCollection zahlen = Regex.Matches(durchgang[i].Value, @"[0-9]{1,}");
                    MatchCollection operatoren = Regex.Matches(durchgang[i].Value, @"[(\/|\*)]{1}");
                    for (int j = -1; j < operatoren.Count; j++)
                    {
                        if (ersteZahl)
                        {
                            zwichenErg = Convert.ToDouble(zahlen[0].Value.ToString());
                            ersteZahl = false;
                        }
                        else
                            if (operatoren[j].Value.ToString().Equals(@"/")) zwichenErg /= Convert.ToDouble(zahlen[j + 1].Value.ToString());
                            else zwichenErg *= Convert.ToDouble(zahlen[j + 1].Value.ToString());
                    }
                }
                else
                {
                    ergebnis += Convert.ToDouble(durchgang[i].Value.ToString());
                }
                if (rOperator.Equals('+')) ergebnis += zwichenErg;
                else ergebnis -= zwichenErg;
            }
            return ergebnis;
        }
    }
}


Funktioniert einwandfrei =)
Verbesserungsvorschläge sind wie immer erwünscht 🙂

Und falls ihr möchtet, dass ich ihn kommentiere zum besseren Verständniss, kann ich das gerne noch nachholen !

*EDIT*
Hab grad noch ein captcha für "divide by 0"-Errors o.ä. eingebaut.

mfg
blue

16.08.2008 - 20:59 Uhr

Danke das du dir die Mühe gemacht hast, einen Server zu schreiben. Nur mein Problem lag nicht beim Server sondern beim Client 😉 Denn den Echo-Server bekomme ich bereits vom Tutorial gestellt und ich soll den passenden Client dazu schreiben.

Ich poste mal den Server (mein Client steht ja oben):


using System;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
 
namespace TCPServerSocket
{
    class TCPServerSocket
    {
        private const int BUFSIZE = 32;
        private const int BACKLOG = 5;
 
 
        static void Main(string[] args)
        {
            if (args.Length > 1)
            {
                throw new ArgumentException("Parameters: [<Port>]");
            }
 
            int servPort = (args.Length == 1) ? Int32.Parse(args[0]) : 7;
 
            Socket server = null;
 
            try
            {
                server = new Socket(AddressFamily.InterNetwork,
                                    SocketType.Stream,
                                    ProtocolType.Tcp);
 
                // Assoziiert den Socket mit einem lokalen Endpunkt
                server.Bind(new IPEndPoint(IPAddress.Any, servPort));
 
                // Versetzt den Socket in den aktiven Abhörmodus 
                server.Listen(BACKLOG);
            }
            catch (SocketException se)
            {
                Console.WriteLine(se.ErrorCode + ": " + se.Message);
                Environment.Exit(se.ErrorCode);
            }
 
            byte[] rcvBuffer = new byte[BUFSIZE];
            int bytesRcvd;
 
            // Lässt den Server in einer Endlosschleife laufen
            for (; ; )
            {
                Socket client = null;
 
                try
                {
                    client = server.Accept();
 
                    Console.Write("Handling client at " + client.RemoteEndPoint + " - ");
 
                    // Empfange bis der client die Verbindung schließt, das geschieht
                    // indem 0 zurückgegeben wird
                    int totalbytesEchoed = 0;
                    while ((bytesRcvd = client.Receive(rcvBuffer, 0, rcvBuffer.Length,
                                                       SocketFlags.None)) > 0)
                    {
                        client.Send(rcvBuffer, 0, bytesRcvd, SocketFlags.None);
                        totalbytesEchoed += bytesRcvd;
                    }
                    Console.WriteLine("echoed {0} bytes.", totalbytesEchoed);
 
                    client.Shutdown(SocketShutdown.Both);
                    client.Close();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    client.Close();
                }
            }
        }
    }
}

Ich möchte weder nerven noch, dass ihr für mich was programmiert (wenn ihrs doch tut, halt ich euch nicht auf 😉 ), denn dafür ist die Jobbörse.
Ich verstehe nur einfach die Fehlermeldung nicht X(

mfg
blue

16.08.2008 - 18:49 Uhr

Ach stimmt, hätte gleich nach Regex suchen sollen, nicht nach dem was ich getan habe =)
Look@my signature 😉

mfg
bluedragon

ps: dann mach ich mal.

16.08.2008 - 18:37 Uhr

Hätte da einen guten Lösungsansatz (war den ganzen Tag unterwegs d.h. hats so lange gedauert). Aber für den bräuchte ich eine Funktion, so wie die preg_match_all() Funktion, die ich von PHP her kenne. Google hat mir nach 5 Seiten durchblättern nicht annährend was gegeben.
Ganz konkrete Frage: gibt es so eine Funktion in C# oder nicht ?

mfg
bluedragon

16.08.2008 - 18:04 Uhr

Ne es liegt nicht an dem Socket, habe mir innerhalb der Methode schon ausgeben lassen ob der Socket verbunden ist. Die Eigenschaft Connected ist auf treu.
Aber hier mal der ganze Code des Clients:


using System;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
using System.Text.RegularExpressions;  

namespace TcpClient
{
    class TcpClient
    {
        static void Main(string[] args)
        {
            new TcpClient(args);
        }

        public TcpClient(string[] args)
        {
            string paramEntering="", serverIp="";
            int port = 7;
    
            SocketNotInstanced:
            
            Socket clientSocket = null;

            switch (args.Length)
            {
                case 2:
                    serverIp = args[0];
                    paramEntering = args[1];
                    break;
                case 1:
                    paramEntering = args[0];
                    Console.Write("Bitte geben sie die IP des Hosts ein:");
                    serverIp = Console.ReadLine();
                    break;
                case 0:
                    Console.Write("Bitte geben sie die IP des Hosts ein:");
                    serverIp = Console.ReadLine();
                    paramEntering = "Wieso hast du nix engegeben :(";
                    break;
            }

            Regex serverIpRegex = new Regex(@"\b(:question:(:question:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(:question:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b");
            
            while (!serverIpRegex.IsMatch(serverIp))
            {
                Console.Write("Ungültiges Format !\nBitte geben sie eine gültige IP ein:");
                serverIp = Console.ReadLine();
                Console.WriteLine();
            }

            
            if (!ProveIP(serverIp))
            {
                Console.WriteLine("Host existiert nicht !");
                goto SocketNotInstanced;
            }


            clientSocket = SetSocket(serverIp, port);
            if (clientSocket == null)
            {
                Console.WriteLine("Verbindung fehlgeschlagen !\n");
                if(args.Length == 2)
                {
                    args = new string[]{args[1]};
                }
                goto SocketNotInstanced;
            }
            else
            {
                Console.WriteLine(SendReceive(paramEntering, clientSocket));
            }

            Console.ReadLine();
        }

        private static bool ProveIP(string serverIp)
        {           
            IPHostEntry hostEntry = Dns.GetHostEntry(serverIp);

            if (hostEntry.HostName.Equals(serverIp)) return false;
            else return true;
            
        }

        private static Socket SetSocket(string host, int port)
        {
            Socket sock = null;
            IPHostEntry hostEntry = Dns.GetHostEntry(host);

            foreach (IPAddress ip in hostEntry.AddressList)
            {
                IPEndPoint ipEp = new IPEndPoint(ip, port);
                Socket tempSock = new Socket(ipEp.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

                tempSock.Connect(ipEp);

                if (tempSock.Connected)
                {
                    sock = tempSock;
                    break;
                }
            }

            return sock;
        }

        private static string SendReceive(string startParam, Socket clientSocket)
        {

            int totalBytesRcvd = 0;
            byte[] rcvBuffer = new byte[1024];
            int bytesRcvd; ;
            string output = "";

            try
            {
                clientSocket.Send(Encoding.ASCII.GetBytes(startParam));

                while((bytesRcvd = clientSocket.Receive(rcvBuffer, 0, rcvBuffer.Length, SocketFlags.None)) > 0)
                {
                    output += Encoding.ASCII.GetString(rcvBuffer, 0, bytesRcvd);
                    totalBytesRcvd += bytesRcvd;
                }
                
                return ("Es wurden " + totalBytesRcvd.ToString() + " bytes erhalten, folgender text kam zu stande:" + output);
            }
            catch (SocketException se)
            {
                Console.WriteLine(se.Source + ": " + se.Message + "\n");
                return ("Datenübertragung fehlgeschlagen !");
            }       
        }
    }
}

Verbesserungsvorschläge am Code sind neben meinem Problem, auch erwünscht =)

mfg
bluedragon

16.08.2008 - 12:08 Uhr

Danke für die Antworten, habe an rekursion gar nicht gedacht, werd mich mal dran versuchen, wenn ich eine Lösung habe dann geb ich sie euch =)

mfg
blue

16.08.2008 - 01:42 Uhr

Servus,
ist es möglich oder besser noch, gibt es eine Funktion, die mir einen String berechnen kann ? Beispielsweise: Funktion("43+4/2-8-32+1") . Rückgabewert, wäre das Ergebnis.
Ich bastel seid 3 Stunden an einer Lösung, und splitte den Haupstring immer weiter, aber ich komme zu keiner Lösung. Das schwierige, an dem ganzem ist halt, dass die Punkt- vor Stric rechnung eingehalten werden soll !

mfg
bluedragon

15.08.2008 - 23:41 Uhr

Hi Leute,

ich stehe mal wieder vor einem Problem. Ich arbeite gerade ein C#-Tutorial durch, wo mir die Aufgabe gestellt wurde, zu einem gestelltem Echo-Server-Script, sprich nem Code des Tutorials - um Grundlagen zu erklären - den passenden Client zu schreiben.
Der Client soll nur einen String einlesen, über die Konsole, dann die Daten an den Server schicken und das "Echo" erhalten.
Ich habe bereits alle möglichen Fehlerquellen soweit eingegrenzt, dass ich 100% weiß, das der Fehler bei dieser Funktion liegt, denn die Verbindung zum Server steht.


private static string SendReceive(string startParam, Socket clientSocket)
{
      int totalBytesRcvd = 0;
      byte[] rcvBuffer = new byte[1024];
      int bytesRcvd;
      string output = "";

      try
      {
           clientSocket.Send(Encoding.ASCII.GetBytes(startParam));

           while((bytesRcvd = clientSocket.Receive(rcvBuffer, 0, rcvBuffer.Length, SocketFlags.None)) > 0)
           {
                output += Encoding.ASCII.GetString(rcvBuffer, 0, bytesRcvd);
                totalBytesRcvd += bytesRcvd;
           }
           return ("Es wurden " + totalBytesRcvd.ToString() + " bytes erhalten, folgender text kam zu stande:" + output);
      }
      catch (SocketException se)
      {
           Console.WriteLine(se.Source + ": " + se.Message + "\n");
           return ("Datenübertragung fehlgeschlagen !");
      }       
}

Der erste Parameter ist args[0] der Main Funktion und der zweite Parameter, ist ein, mit dem Server, bereits verbundener Socket.

Hab echt keinen Plan wieso es nicht Funktioniert X(

mfg
bluedragon

*EDIT*
Auf der Server-Konsole erscheint beim Übertragungsversuch der Fehler:
"System:Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über einen Datagrammsocket mit einem sendto-Aufruf) keine Adresse angegeben wurde"

Auf der Client-Konsole erscheint beim Übertragungsversuch der Fehler:
"System:Eine vorhandene Verbindung wurde vom Remotehost geschlossen

Datenübertragung fehlgeschlagen !"

15.08.2008 - 19:58 Uhr

Danke funktioniert einwandfrei, aber was ist an meinem falsch und warum stehen bei dir die "?" direkt nach den normalen Klammern zu "(" ??? Warum sollte bei der Eingabe der IP ein Doppelpunkt stehen ?(
Fragen über Fragen 😉
Ich glaube, ich muss mich da nochmal besser einarbeiten 🙁

mfg
blue

15.08.2008 - 19:17 Uhr

Hallo Leute,

ich habe mir das Tutorial für die regulären Ausdrücke dieses Forums durchgelesen, aber schaffe es nicht mein Problem komplett zu lösen.
Und zwar möchte ich mir ein Regex für IP-Adressen basteln. Das klappte auch, sofern alle Oktetts der IP bis 999 gingen.
Mit:


Regex serverIpRegex = new Regex(@"^([0-9]{1,3}\.){3}[0-9]{1,3}$\z");

hat es wunderbar geklappt. Nur leider geht ein Oktett nur bis 255 und nicht bis 999.

Jetzt habe ich es mal anders probiert. Da man ja keinen totalen Werteberreich eintragen kann (ausser jemand sagte mir was gegenteiliges), sieht das so aus:


Regex serverIpRegex = new Regex(@"^(2[0-5][0-5]|1[0-9]{2}|[1-9][0-9]|[1-9])\.\1\.\1.\1$\z");

Wäre nett wenn mir jemand helfen könnte =)

mfg
bluedragon

12.07.2008 - 13:00 Uhr

Danke ich glaube genau sowas habe ich gesucht 🙂)

lg blue

12.07.2008 - 12:04 Uhr

Ne dann habe ich mich wohl falsch ausgedrückt. Ich möchte mit meinem Freund halt sone art "mini-Betriebssystem" programmieren. Natürlich ist das kein wirkliches Betriebssystem sondern nur eine WindowsApplikation die wie eines wirkt oder eiens simuliert. UND während diese "mini-Betriebssystem" (mir fällt keine besser Bezeichnung ein) im Vollbildmodus läuft und die Verwaltung von Windows vereinfacht, möchte ich es dem Benutzter ermöglichen, seine anderen Programme ganz "normal" nutzen zu können, ABER diese Simulation sollt trotzdem fortlaufend im Vollbildmodus bleiben.
Ich hoffe jetzt weiß jemand was ich meine =)

lg blue

12.07.2008 - 01:29 Uhr

Danke für die Antwort, werde mich da Morgen dran setzen und schauen, ob das andere Progamm dann immernoch im Vollbildmodus läuft 🙂

lg blue

11.07.2008 - 23:33 Uhr

Hallo ihr da draußen,

ich würde gerne wissen wie ich durch anklicken einer Grafik oder halt PictureBox, ein Progamm von Windows starten kann. Das Problem dabei ist nicht der EventHandler dazu, sondern 1. eher wie ich ein Programm starten kann beispielsweise Paint und 2. programmiere ich zusammen mit einem Freunde an einer Anwendung, die die Benutzung von einem "mini-Betriebssystem" simuliert, weiß nicht genau wie ichs beschreiben soll. Jedenfalls ist es ein Programm, dass im Vollbildmodus läuft und soll auch weiter - nach starten von Bsp. Paint - im Vollbildmodus bleiben.
Ich wüsste leider nicht wo ich anfang soll zu suchen oder zu programmieren, wäre nett wenn mir jemand nen Tipp geben kann 🙂

lg blue

10.07.2008 - 14:55 Uhr

Ich weiß, ich selbst mache es auch anders, wollte das Thema aber trotzdem gerne verstehen 😉 Ist ja nicht verboten oda ^^

*EDIT*
und wie herbivore schon sagte, er selbst wüsste für das Beispiel auch keine Sinnvolle Kapselung !

10.07.2008 - 14:50 Uhr

Ah danke, jetzt habe ichs verstanden =)

10.07.2008 - 14:43 Uhr

Danke für die schnelle Antwort, nur nochmal fürs Selbstverständniss:
Weil ich die public Variable der Kopie ändere, ändere ich auch den Wert der public Variable des originals, weil der Inhalt der Kopie nur ein Verweis zum Original ist ?
Oder bin ich immer noch zu doof dafür ? Kann sein, dass ich da was verwechsel, aber so stell ich mir das gerade vor 🙁

grüße
blue

10.07.2008 - 14:17 Uhr

[EDIT]Abgeteilt von [Artikel] C# und Übergabemechanismen: call by value vs. call by reference (ref/out)[/EDIT]

Hallo ich schliesse mich tecla an und muss sagen, dass ich das Thema auch sehr interessant finde.
Leider verstehe ich nur eine einzige Sache nicht:
Wieso wird hier 6 ausgeben ? Die Methode ist doch nicht call by reference und wenn man eine Referenz übergibt wird doch nur eine Kopie erstellt. Aber wenn man die Kopie verändert, wieso wird dann hier auch die original Referenz verändert ?


using System;

class Auto
{
    public Auto(int AnzahlReifen)
    {
        m_AnzahlReifen = AnzahlReifen;
    }
    public int m_AnzahlReifen;
}

public class MyMain
{

    public static void Main()
    {
        Auto MeinAuto = new Auto(4);
        foo(MeinAuto);
        System.Console.WriteLine(MeinAuto.m_AnzahlReifen);  // gibt 6 aus
    }

    static void foo(Auto irgendeinAuto)
    {
        irgendeinAuto.m_AnzahlReifen = 6;
    }
}

Währe nett wenn mir das nochmal jemand erklären könnte, denn in dem Thema geht für mich keine schlüssige Begründung für die Ausgabe hervor 🙁

liebe Grüße
blue

01.07.2008 - 08:01 Uhr

Hab ich verstanden, aber der Post war doch jetzt unnötig, da die Frage eh schon geklärt war und ich weiß was herbivore meinte !

01.07.2008 - 07:19 Uhr

Hab es schon wieder alleine hinbekommen, sry 🙂
Will mir hier keine Beiträge erschleichen, aber wenn ich nich weiterweiß, dann poste ich mein Problem und versuch es trotzdem noch weiter =)


Bitmap iconmiddle = new Bitmap(middle.Width, middle.Height);
Graphics iconmiddleGraphic = Graphics.FromImage(iconmiddle);
iconmiddleGraphic.Clear(Color.Transparent);

Icon iconmiddleIcon = new Icon(@"XXX\Computer.ico", middle_height, middle_height - 10);
iconmiddleGraphic.DrawImage(iconmiddleIcon.ToBitmap(), 0, 0);

iconmiddleIcon = new Icon(@"XXX\DVD.ico", middle_height, middle_height - 10);
iconmiddleGraphic.DrawImage(iconmiddleIcon.ToBitmap(), (middle.Width / 2 - iconmiddleIcon.Width / 2), 0);

iconmiddleIcon = new Icon(@"XXX\Floppy.ico", middle_height, middle_height - 10);
iconmiddleGraphic.DrawImage(iconmiddleIcon.ToBitmap(), middle.Width - iconmiddleIcon.Width, 0);

middle.Image = iconmiddle;
01.07.2008 - 06:22 Uhr

Hallo ihr da,
ich würde gerne eine Picturebox mit mehreren Bildern laden, bekomme es aber leider nicht hin 🙁 Also ein Bild is ja an sich kein Problem. Ein Bild soll links sein, eins in der Mitte und eins Rechts. Mein Ansatz war nun folgender:


Bitmap iconmiddle = new Bitmap(middle.Width, middle.Height);
Graphics iconmiddleGraphic = Graphics.FromImage(iconmiddle);
iconmiddleGraphic.Clear(Color.Transparent);

Icon iconmiddleIcon = new Icon(@"XXX\Computer.ico", 50, 40);
iconmiddleGraphic.DrawIcon(iconmiddleIcon, 0, 0);

iconmiddleIcon = new Icon(@"XXX\DVD.ico", 50, 40);
iconmiddleGraphic.DrawIcon(iconmiddleIcon, (middle.Width / 2 - iconmiddleIcon.Width / 2), 0);

iconmiddleIcon = new Icon(@"XXX\Floppy.ico", 50, 40);
iconmiddleGraphic.DrawIcon(iconmiddleIcon, (middle.Width - iconmiddleIcon.Width), 0);

middle ist die Picturebox.

Aber leider weiß ich dann nicht weiter, insofern das überhaupt richtig wäre 🙁

mfg
bluedragon

01.07.2008 - 01:30 Uhr

Guten Abend,
ich suche mich seit etwas einer Stunde dumm und dusselig nach einer vernünfitgen Seite, wo man gezeigt bekommt wie man ein Kontextmenü für seine Form erstellt.
Ich möchte gerne, wenn die rechte Maustaste gedrückt wird, sich ein Kontextmenü öffnet. Klar die rechte Maustaste abfragen ist kein Problem, jedoch das Menü an sich ! Ich habe leider keine Ahnunh wie ich sowas mache, aber weiß das es geht 😉
Bitte gebt mir keinen Link von galileocomputing, weil ich die Seite schon sehr lange kenne und zum kotzen finde.
Auf der Seite ist es so, als würde man einen Kuchen backen und die sagen einem nur die Zutaten, aber nicht wie man sie zusammensetz und das regt mich relativ auf 🙁

Naja ich hör mal auf mit dem rumgeheule und hoffe das ihr mir helfen könnt 🙂

MfG
bluedragon

*EDIT* hab selber gefunden 🙂

30.06.2008 - 23:48 Uhr

Ah ok danke sehr, der Begriff Vollbildmodus sollte mir eigentlich geläufig sein, aber nicht wirklich eingefallen ^^
Danke nochma !

mfg
bluedragon

30.06.2008 - 23:31 Uhr

Hallo liebe Leute,
ich hab ma wieder eine Frage:
Und zwar möchten ein Kumpel und ich eine kleine Betriebssystem-ähnliche Windowsaccplication machen und wissen beide - auch nach langem Suchen via Board und Google - nicht wie man es schafft, dass die Anwendung über den ganzen Bildschirm geht. Aber nicht einfach die Clientsize auf die Auflösung anpassen, sondern so wie bei einem Computerspiel, dass der komplette Bildschirm bedeckt ist und man sämtliche Dinge wie Taskleiste etc. nicht mehr sieht.

Hoffe ihr versteht was ich meine 🙂

MfG
bluedragon

11.06.2008 - 21:17 Uhr

Danke sehr klappt super !
Kann geclosed werden.

MfG
bluedragon