3

I was trying to use SSH tunneling to access my MySQL database using C# but I'm getting an exception

Unable to connect to any of the specified MySQL hosts.

I got this code with the help of this:
C# SSH tunnel to MySQL server

Here is my code:

PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("example.com", 2222, "username", "password");
connectionInfo.Timeout = TimeSpan.FromSeconds(30);

using (var client = new SshClient(connectionInfo))
{
    try
    {
        Console.WriteLine("Trying SSH connection...");
        client.Connect();
        if (client.IsConnected)
        {
            Console.WriteLine("SSH connection is active: {0}", client.ConnectionInfo.ToString());
        }
        else
        {
            Console.WriteLine("SSH connection has failed: {0}", client.ConnectionInfo.ToString());
        }

        Console.WriteLine("\r\nTrying port forwarding...");
        var portFwld = new ForwardedPortLocal(IPAddress.Loopback.ToString(),2222, "example.com", 3306); 
        client.AddForwardedPort(portFwld);
        portFwld.Start();
        if (portFwld.IsStarted)
        {
            Console.WriteLine("Port forwarded: {0}", portFwld.ToString());
    Console.WriteLine("\r\nTrying database connection...");

 DBConnect dbConnect = new DBConnect("127.0.0.1", "database", "username", "password", "3306");
    int id =  dbConnect.Count("table");
    MessageBox.Show(id + " count ");
            }
            else
            {
                Console.WriteLine("Port forwarding has failed.");
            }

        }
        catch (SshException ex)
        {
            Console.WriteLine("SSH client connection error: {0}", ex.Message);
        }
        catch (System.Net.Sockets.SocketException ex1)
    {
        Console.WriteLine("Socket connection error: {0}", ex1.Message);
    }

}
private MySqlConnection connection;

private string server;
public string Server
{
    get
    {
        return this.server;
    }
    set
    {
        this.server = value;
    }
}

private string database;
public string Database
{
    get
    {
        return this.database;
    }
    set
    {
        this.database = value;
    }
}

private string uid;
public string Uid
{
    get
    {
        return this.server;
    }
    set
    {
        this.server = value;
    }
}

private string password;
public string Password
{
    get
    {
        return this.password;
    }
    set
    {
        this.password = value;
    }
}

private string port;
public string Port
{
    get
    {
        return this.port;
    }
    set
    {
        this.port = value;
    }
}

//Constructor
public DBConnect(string server, string database, string uid, string password, string port = "3306")
{
    this.server = server;

    this.database = database;
    this.uid = uid;
    this.password = password;
    this.port = port;

    Initialize();
}

//Initialize values
private void Initialize()
{
    string connectionString;
    connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
    connection = new MySqlConnection(connectionString);
}


//open connection to database
private bool OpenConnection()
{
    try
    {
        connection.Open();
        Console.WriteLine("MySQL connected.");
        return true;
    }
    catch (MySqlException ex)
    {
        //When handling errors, you can your application's response based on the error number.
        //The two most common error numbers when connecting are as follows:
        //0: Cannot connect to server.
        //1045: Invalid user name and/or password.
        switch (ex.Number)
        {
            case 0:
                Console.WriteLine("Cannot connect to server.  Contact administrator");
                break;

            case 1045:
                Console.WriteLine("Invalid username/password, please try again");
                break;

            default:
                Console.WriteLine("Unhandled exception: {0}.", ex.Message);
                break;

        }
        return false;
    }
}

//Close connection
private bool CloseConnection()
{
    try
    {
        connection.Close();
        return true;
    }
    catch (MySqlException ex)
    {
        Console.WriteLine(ex.Message);
        return false;
    }
}

//Count statement
public int Count(string tableName)
{
    string query = "SELECT Count(*) FROM " + tableName;
    int Count = -1;

    //Open Connection
    if (this.OpenConnection() == true)
    {
        //Create Mysql Command
        MySqlCommand cmd = new MySqlCommand(query, connection);

        //ExecuteScalar will return one value
        Count = int.Parse(cmd.ExecuteScalar() + "");

        //close Connection
        this.CloseConnection();

        return Count;
    }

    return Count;

}

The output that I got in my console is:

Trying SSH connection...
A first chance exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
SSH connection is active: Renci.SshNet.PasswordConnectionInfo

Trying port forwarding...
Port forwarded: Renci.SshNet.ForwardedPortLocal
A first chance exception of type 'Renci.SshNet.Common.SshConnectionException' occurred in Renci.SshNet.dll

Trying database connection...
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
 Error: 0 : Unable to connect to any of the specified MySQL hosts.
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
Unhandled exception: Unable to connect to any of the specified MySQL hosts..

UPATE:

I have changed the port forwarding settings to :

var portFwld = new ForwardedPortLocal("127.0.0.1", 1000, "127.0.0.1", 3306);

and I have changed my mySQL String to :

connectionString = "server=127.0.0.1;port=1000; UID=username; password=password; database=data1; charset=utf8;Allow User Variables=True";

I'm being connected to the ssh and my port is forwarded but I still can't connect to MySQL database, I'm getting an exception:

A first chance exception of type 'System.IO.EndOfStreamException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in MySql.Data.dll
 Error: 0 : Reading from the stream has failed.

1 Answer 1

2

You have to connect the MySQL to the bound port of the forwarding. I.e. to the 2222.

Or even more semantically correct, use portFwld.BoundPort. Equivalently, use portFwld.BoundHost.

DBConnect dbConnect = new DBConnect(portFwld.BoundHost, "database", "username", "password", portFwld.BoundPort);

Also note that it makes more sense to refer to the MySQL host as "localhost", rather than the "example.com", as the hostname is resolved on the server-side. And when on the server side, you typically won't connect to "example.com", but to a "localhost".

var portFwld = new ForwardedPortLocal(IPAddress.Loopback.ToString(), 2222, "localhost", 3306); 

And of course you need to keep the SSH session open while you need the tunnel. So you have to connect to the DB within the using block:

using (var client = new SshClient(connectionInfo))
{
    ...
    client.Connect();
    ...
    portFwld.Start();
    ... 
    DBConnect dbConnect = new DBConnect(portFwld.BoundHost, "database", "username", "password", portFwld.BoundPort);
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.