【发布时间】:2014-08-10 15:44:57
【问题描述】:
我在使用 SSH.NET 库时遇到了 2 个问题。
我想创建 SSH 连接然后断开连接。但是如果我开始异步读取,断开连接会导致问题。当我尝试结束连接时,我的程序只是冻结了。
public void button1_Click(object sender, EventArgs e)
{
var ssh = new SshClient(IP, UserName, Password);
ssh.Connect();
var stream = ssh.CreateShellStream("anything", 80, 24, 800, 600, 4096);
byte[] buffer = new byte[1000];
stream.BeginRead(buffer, 0, buffer.Length, null, null);
stream.DataReceived += new EventHandler<Renci.SshNet.Common.ShellDataEventArgs>(
(s, ex) =>
{
Invoke((MethodInvoker)delegate
{
textBox1.AppendText(stream.Read());
});
}
);
stream.WriteLine("ls");
stream.Dispose();
ssh.Disconnect(); //problem here
}
我也不知道如何创建一个可从代码中的任何位置使用的连接。我希望能够定义 IP、用户名和密码(例如,将它们写在一些文本框中),建立连接,然后通过执行一些命令并获取输入来与之交互。据我了解,传递凭据需要一些事件处理程序(例如 button1_Click),但是如果我想通过传递命令与创建的 stream = ssh.CreateShellStream(...) 进行交互,例如button2_Click,我不能这样做,因为“当前上下文中不存在名称“流”。
之前我一直通过 plik(来自 PuTTY)和 C# 的 Process 功能来做:
private void ConnectButton_Click(object sender, EventArgs e)
{
...
p = new Process();
...
sw = p.StandardInput;
...
}
其中 sw 是在 ConnectButton_Click 事件处理程序之外定义的流写入器。
谢谢。
【问题讨论】:
-
如果您还没有完成/开始阅读,为什么要断开连接?如果它是异步的,你怎么知道读取是否结束?
-
这更像是一个笼统的问题,并不是由特定问题引起的。我根本不知道这里有什么问题。假设我想为了结束连接而结束连接。 :) 我想为我毫无疑问的无知道歉。我不是程序员。我只需要创建一个简单的工具,并且有一些我无法解决的问题。
-
不要卖空自己。您可能还没有经验,但您正在编写代码。你是个程序员;)。
标签: c# multithreading winforms ssh.net