如何在文本框中显示iperf cmd提示符的输出



我使用iperf-2.0.5-2-win32工具查找网络带宽。我用c#写了代码,它打开cmd提示符,传递iperf参数来启动服务器端&客户端。Iperf-2.0.5-2-win32 exe不会直接打开,只需要通过CMD提示打开。目前输出(传输速率&带宽)显示在cmd提示符本身。我希望这些输出显示在文本框中我也试过StreamReader。但它取null,我也试过OutputDataReceived Event,它也取null。发现ipconfig &amp的一些代码;平。但这些都不是iperf代码。

button_click event(),
{
Process Client_proc = new Process();
ProcessStartInfo Client_command = new ProcessStartInfo("cmd.exe"); 
string ip = txtIP.Text;
Client_command.CreateNoWindow = true;
Client_command.WindowStyle = ProcessWindowStyle.Hidden;
Client_command.WorkingDirectory = @"E:IperfRunEXE_Through_Applicationiperf-2.0.5-2-win32";
Client_command.Arguments = "/c START iperf -c " + ip;
Client_proc.StartInfo = Client_command;
Client_command.RedirectStandardOutput = true;
Client_command.UseShellExecute = false;
Client_proc.OutputDataReceived += new DataReceivedEventHandler(Client_proc_OutputDataReceived);
Client_proc.Start(); 
Client_proc.BeginOutputReadLine(); 
Client_proc.WaitForExit();
}
void Client_proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
string newLine = e.Data.Trim() + Environment.NewLine;
MethodInvoker append = () => txtOutput.Text += newLine;
txtOutput.BeginInvoke(append);
}
}

请帮帮我。欢迎尽早回复由于

您可以使用完整的代码进行处理它并不完美(使用多个流时会出现一些问题)

public void RunProcess(string FileName, string Arguments, bool EventWhenExit )
{
    process = new Process();
    process.EnableRaisingEvents = true;
    process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.LoadUserProfile = false;
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.FileName = FileName; // Gets or sets the application or document to start.
    process.StartInfo.Arguments = Arguments;//Gets or sets the set of command-line arguments to use when starting the application      
    Thread.Sleep(1000);
    if (EventWhenExit)
    {
        process.EnableRaisingEvents = true;
        process.Exited += new EventHandler(myprocess_Exited);/*New line */
    }
    process.Start();
    process.BeginOutputReadLine();
    PID = process.Id;

}
private void myprocess_Exited(object sender, EventArgs e)
{
    process.Refresh();
    Thread.Sleep(2000);
    onProcessEnd(this, "ENDOF " + Proc.ToString());
    Console.WriteLine("Process exsiting ");
}

private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e)
{
    string OutputFromProcess = e.Data;
    //fire event to event handler class for further use
    onDataOutputFromProcess(this, OutputFromProcess, Proc.ToString());
}

在GUI层中,您应该绑定到onDataOutputFromProcess事件这里应该有像

这样的内容
if (screenToPrint.InvokeRequired) //&& this.Visible)
{
    try
    {
        this.Invoke(new Action<AppendToScreenParam>(AppendTextFullConfig), new object[] { append });
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
    return;
}
else
{
    screenToPrint.SelectionFont = font;
    screenToPrint.SelectionColor = append.Color;
    //screenToPrint.AppendText(append.Message);
    string TextToPrint = string.Format("{0}n", append.Message);
    screenToPrint.AppendText(TextToPrint);
}

}

可能是因为iperf进程返回错误。用Client_proc.ErrorDataReceived += Client_proc_ErrorDataReceived;订阅ErrorDataReceived事件并查看结果。如果command返回错误,您可以在输出中看到错误消息。

void Client_proc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    if (e.Data != null)
    {
        this.txtOutput.BeginInvoke(new MethodInvoker(() => { this.txtOutput.Text = e.Data; }));
    }
}

相关内容

  • 没有找到相关文章

最新更新