SSH-Verbindung trennt sich bei Formwechsel...

  • C#

    SSH-Verbindung trennt sich bei Formwechsel...

    Guten Abend zusammen,
    Ich bin derzeit an einem Projekt, das eine Loginform benutzt, welche nach Benutzername und Passwort fragt und danach per MySQL-Abfrage danach sucht (und soweit auch findet).
    Danach geht ein Chatfenster auf, welches nun, da es ja nicht anders geht, stääääändig nach neuen Nachrichten suchen soll, im Hintergrund, in einer externen Klasse, per BackgroundWorker. Ich greif also auf den bgw von meiner Chatform zu und mach RunWorkerAsync. Soweit sogut. Doch nun läuft er mir nur genau bis zu cmd.ExecuteReader. Ich benutze übrigens bis dorthin immer dieselbe, noch offene(?) Verbindung "connn". Er bleibt jedoch hängen beim cmd.ExecuteReader und gibt keinen Fehler aus, ausser ich unterbreche und schaue nach: Da stehen nun tonnenweise Verbindungsfehler, angeführt von:
    "Ein Blockierungsvorgang wurde durch einen Aufruf von WSACancelBlockingCall unterbrochen." (System.Net.Sockets.SocketException)
    , obwohl ich ja eigentlich nur Renci.SshNet und MySQL.Data verwende. Danach sind einige
    "Eine bestehende Verbindung wurde softwaregesteuert durch den Hostcomputer abgebrochen."
    -Fehler und schlussendlich der wohl daraus resultierende:
    "Client not connected." (Renci.SshNet.Common.SshConnectionException).
    IntelliTrace zeichnet mir dabei MySqlDataReader reader = cmd.ExecuteReader(); sowie die eigentlich auszulösende catch-Anweisung an.

    Dasselbe Phänomen tritt auch auf, wenn ich die alte Verbindung close und eine neue (connn2) verwende und kurz vor dem cmd.ExecuteReader-Vorgang einfüge...

    Hab alles auch schon mit einer Auslagerung der einzelnen Connections in mehrere Klassen versucht, jedoch hab ich keine Chance, dass da was geht.
    Codeschnipsel, welche eventuell helfen:

    Quellcode

    1. public static void conaufb()
    2. {
    3. using (var SshClient = new SshClient(host, username,
    4. new PrivateKeyFile(File.OpenRead(@"path\akey.ppk"),
    5. "passPhrase")))
    6. using (var port = new ForwardedPortLocal("127.0.0.1", 3307, "127.0.0.1", 3306))
    7. if (connn.State == ConnectionState.Closed && value == 0)
    8. {
    9. {
    10. try
    11. {
    12. value = 1;
    13. //SshClient.KeepAliveInterval = TimeSpan.FromMinutes(30);
    14. SshClient.Connect();
    15. //SshClient.SendKeepAlive();
    16. SshClient.AddForwardedPort(port);
    17. port.Start();
    18. if (port.IsStarted)
    19. {
    20. cnc.runsqlstr.RunSynchronously();
    21. }
    22. else
    23. {
    24. MessageBox.Show("Port-Forwarding fehlgeschlagen.");
    25. }
    26. }
    27. catch
    28. {
    29. MessageBox.Show("Verbindungsaufbau gescheitert!", "Verbindungsinfo", MessageBoxButtons.OK, MessageBoxIcon.Error);
    30. MessageBox.Show("Starte im Offlinemodus.", "Offline", MessageBoxButtons.OK, MessageBoxIcon.Information);
    31. }
    32. }
    33. }
    34. else
    35. {
    36. connn.Close();
    37. //Bitte auskommentieren!
    38. //MessageBox.Show("MySQL-Verbindung adieu!", "Verbindungsinfo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    39. port.Stop();
    40. //Bitte auskommentieren!
    41. //MessageBox.Show("Port-Forwarding beendet!", "Verbindungsinfo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    42. SshClient.Disconnect();
    43. //Bitte auskommentieren!
    44. //MessageBox.Show("SSH-Verbindung getrennt!", "Verbindungsinfo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    45. }
    46. }

    Dies ist der Authentifizierungscode zum SSH-Tunnelaufbau (funktioniert). Nun wird untenstehender Code aufgerufen:

    Quellcode

    1. public static void establishstr()
    2. {
    3. username = Microsoft.VisualBasic.Interaction.InputBox("Geben Sie hier bitte den Loginnamen ein:", "Loginname", "User...");
    4. string pass = Microsoft.VisualBasic.Interaction.InputBox("Geben Sie hier bitte das Passwort ein:", "Loginpasswort", "Passwort...");
    5. using (MySqlCommand cmd = connn.CreateCommand())
    6. {
    7. try
    8. {
    9. cmd.CommandText = "SELECT * FROM blabla WHERE username = ?username AND password = ?password";
    10. cmd.Parameters.Add(new MySqlParameter("username", username));
    11. cmd.Parameters.Add(new MySqlParameter("password", pass));
    12. connn.Open();
    13. using (MySqlDataReader reader = cmd.ExecuteReader())
    14. {
    15. int count = 0;
    16. while (reader.Read())
    17. {
    18. count = count + 1;
    19. }
    20. if (count == 1)
    21. {
    22. var vorname = reader["vorname"];
    23. reader.Dispose();
    24. cmd.Dispose();
    25. MessageBox.Show("Login gefunden! Willkommen " + vorname + "! (:", "Login erfolgreich", MessageBoxButtons.OK, MessageBoxIcon.Information);
    26. }
    27. else
    28. {
    29. cmd.Connection.Close();
    30. reader.Dispose();
    31. cmd.Dispose();
    32. MessageBox.Show("Kein Login gefunden (Kombination Passwort/Benutzername falsch)... :C", "Login ungültig", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    33. MessageBox.Show("Starte im Offlinemodus.", "Offline", MessageBoxButtons.OK, MessageBoxIcon.Information);
    34. }
    35. count = 0;
    36. }
    37. }
    38. catch (MySqlException f)
    39. {
    40. MessageBox.Show(f.Message);
    41. }
    42. }
    43. }

    Dieser Code funktioniert ebenfalls! Es wird dann auf die Chatform geleitet, welche dann folgenden Code aufruft:

    Quellcode

    1. public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    2. {
    3. MySqlCommand cmd = new MySqlCommand("SELECT * FROM blablub WHERE username = ?username", connection.connn);
    4. cmd.Parameters.Add(new MySqlParameter("username", "Flash"));
    5. try
    6. {
    7. int count = 0;
    8. MySqlDataReader reader = cmd.ExecuteReader(); //HIER IST FERTIG!
    9. while (reader.Read())
    10. {
    11. count = count + 1;
    12. }
    13. if (count == 1)
    14. {
    15. var incmessage = reader["msgstr"];
    16. reader.Dispose();
    17. cmd.Dispose();
    18. count = 0;
    19. System.Threading.Thread.Sleep(400);
    20. }
    21. }
    22. catch (MySqlException f) //WIRD LEIDER NIE ERREICHT!
    23. {
    24. MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten und die Anwendung muss beendet werden!" + Environment.NewLine + Environment.NewLine + f.ToString(), "Fehler bei der Abfrage");
    25. Application.Exit();
    26. }
    27. }

    Dieser Code nun ist separat in einer anderen Klasse als die obigen Codeschnipsel, welche ebenfalls in einer externen cs sind, welche von der Ladeform aufgerufen werden. ER FUNKTIONIERT ABER NICHT!

    Ich weiss nicht mehr weiter :/


    Freundliche Grüsse
    Flash1232