SSH.NET SocketException:10004调用WSACancelBlockingCall中断了阻塞操作

时间:2014-01-16 09:46:29

标签: c# wpf ssh-tunnel ssh.net

我使用SSH.NET在.Net-Applications中创建SSH隧道。在我的ConsoleApplication / Windows-Service中,这个库可以正常工作。

现在我编写了一个WPF应用程序,它创建了一个SSH隧道来远程访问MySQL数据库。 我可以访问数据库并执行我的SQL语句。

但是如果我在断开与数据库的连接后尝试关闭隧道,我首先得到一个SocketException:10004通过调用WSACancelBlockingCall来中断阻塞操作 然后是几个例外:

  • SocketException:10053主机中的软件已停止建立的连接,可能是因为数据传输超时或协议错误。
  • Renci.SshNet.Common.SshConnectionException:错误的数据包长度XXX(XXX是随机整数)
  • Renci.SshNet.Common.SshConnectionException:客户端未连接。

我使用以下代码打开/关闭隧道:

public class SSHTunnelBuilder
{
    private SshClient client;
    private ForwardedPort port;

    public SSHTunnelBuilder()
    {
    }

    public void CloseTunnel()
    {
        if (this.port != null && this.port.IsStarted)
        {
            this.port.Stop();
        }

        if (this.client != null && this.client.ForwardedPorts.Contains(this.port))
        {
            this.client.RemoveForwardedPort(this.port);
        }

        this.port = null;

        if (this.client != null)
        {
            if (this.client.IsConnected)
            {
                this.client.Disconnect();
            }

            this.client.Dispose();
            this.client = null;
        }
    }

    public void OpenTunnel()
    {
        if (this.client == null)
        {
            this.client = new SshClient("host", "usr", "pwd");
        }

        if (!this.client.IsConnected)
        {
            this.client.Connect();
        }

        if (this.port == null)
        {
            this.port = new ForwardedPortLocal("XXX.XXX.XXX.XXX", 10000, "YYY.YYY.YYY.YYY", 3306);
        }

        if (!this.client.ForwardedPorts.Contains(this.port))
        {
            this.client.AddForwardedPort(this.port);
        }

        if (!this.port.IsStarted)
        {
            this.port.Start();
        }
    }
}

SSHTunnelBuilder在TASK中使用,如下所示:

private void SomeMethod()
{  
    Task.Factory.StartNew(
        new Action(() =>
        {

            SSHTunnelBuilder ssh = new SSHTunnelBuilder();
            try
            {

                ssh.OpenTunnel();

                // Do something

                ssh.CloseTunnel();
                ssh.Dispose();
                ssh = null;
            }
            catch (Exception e)
            {

                ssh.CloseTunnel();
                ssh.Dispose();
                ssh = null;
            }
        }));
}

有人可以向我解释如何摆脱这些例外吗?

0 个答案:

没有答案