运行具有连续值返回的多个线程(ping 程序)

本文关键字:线程 ping 程序 连续 返回 运行 | 更新日期: 2023-09-27 17:56:27

美好的一天

我接手了一个项目,作为一个基础,需要在cmd"ping x.x.x.x -t"中输入一个命令,并且程序需要返回输出,直到指定的参数

正在考虑线程,因为我在多线程方面的不工作有限,在没有指导的情况下我无法继续

我的 ping 类接收字符串 IP,将其添加到预编译的命令字符串等。

我知道用于此用途的内置ping类,但我更喜欢"更长"的方法,因为我可以从中获得有价值的信息/经验

主要对象类:

class ping
{
    Process proc;
    ProcessStartInfo psi;
    string ip_address;
    bool bStop = false;        
    public ping(string ip)
    {
        ip_address = ip;
    }
    public void StartPing()
    {
        string cmdInput;
        psi = new ProcessStartInfo(Environment.GetEnvironmentVariable("COMSPEC"));
        psi.RedirectStandardInput = true;
        psi.RedirectStandardOutput = true;
        psi.UseShellExecute = false;
        proc = Process.Start(psi);
        proc.StandardInput.WriteLine("ping " + ip_address + " -t");        
        cmdInput = proc.StandardOutput.ReadLine();
        cmdInput = proc.StandardOutput.ReadLine();
        cmdInput = proc.StandardOutput.ReadLine();
        cmdInput = proc.StandardOutput.ReadLine();
        cmdInput = proc.StandardOutput.ReadLine();
        cmdInput = proc.StandardOutput.ReadLine();
        while (bStop == false)
        {
            cmdInput = proc.StandardOutput.ReadLine();
            Console.WriteLine(returnPing(cmdInput));
        }
        proc.Close();
    }
    private string returnPing(string cmdInput)
    {
        int start, end;
        string ping;
        if (cmdInput.IndexOf("Reply") != -1 && cmdInput.IndexOf("time") != -1)
        {
            start = cmdInput.IndexOf("time=") + 5;
            end = cmdInput.IndexOf("ms");
            ping = cmdInput.Substring(start, end - start);
            return ping;
        }
        else return "-1";
    }

thread_handler类,它管理ping方法的多个实例,请不要使用控制台.writeline是一个临时输出,我将在将来更改

class thread_handler
{
    string[] ipList;
    private IList<Thread> threadList;
    public thread_handler(string[] ip)
    {
        ipList = ip;
        threadList = new List<Thread>();
        createThreads();            
    }
    private void createThreads()
    {
        foreach (string item in ipList)
        {
            ping NewPing = new ping(item);
            Thread newPingThread = new Thread(NewPing.StartPing);
            newPingThread.IsBackground = true;
            newPingThread.Name = string.Format("{0}", item);
            threadList.Add(newPingThread);
        }
        startAllThreads();
    }
    private void startAllThreads()
    {
        foreach (Thread item in threadList)
        {
            item.Start();
        }
    }
}

程序

class Program
{
    static string[] ipList;
    static void Main(string[] args)
    {
        ipList = new String[3];
        readData();
        sendData();       
    }
    private static void sendData()
    {
        thread_handler thIp = new thread_handler(ipList);
    }
    private static void readData()
    {
        //use sll with name defintions and ip address's with metadata
        ipList[0] = "10.0.0.2";
        ipList[1] = "telkom_exchange";
        ipList[2] = "goo.gl";
    }

该程序的目的是(将来会更改 gui)用于一个简单的控制台,具有各自的维度,以不断 ping 某些 IP 地址(我们有禁止基础设施,因此程序用于信息目的),不断更新每个 ping 回复

不希望任何人完成这个程序,我只需要帮助运行此ping的多个实例(或者可能是"线程"),因此

每个线程在运行"StartPing()"方法时,它应该返回一个输出,例如简单地将ping输出到控制台中,但它没有......

输出:

 The process tried to write to a nonexistent pipe. 
 The process tried to write to a nonexistent pipe.

然后挂起

运行具有连续值返回的多个线程(ping 程序)

您从子进程读取的方式不正确。这是一项令人惊讶的复杂任务。我不知道为什么您会收到此特定错误消息,但听起来它与过程标准输出重定向有关。例如,您尚未重定向标准错误。

我建议您使用堆栈溢出的投票最高的片段之一,通过以下方式找到:site:stackoverflow.com process RedirectStandardOutput 。有数百个这样的问题。大多数解决方案都是微妙的错误。

这是一个很好的清单。

你应该使用 ping 类来执行 ping。此类允许您控制许多细节。

Process.Start() ping.exe的调用涉及太多的开销并使事情复杂化(正如您在尝试中遇到的那样)

尽管很简单,但重定向标准输入和输出就可以了,只需一两个调整,瞧