Автоопределение приложения в локальной сети с использованием C#. net - PullRequest
1 голос
/ 18 февраля 2020

У меня есть приложение для голосового чата с открытым исходным кодом, которое отлично работает в локальной сети.

Но проблема в том, чтобы вручную подключить два компьютера.

Предположим, есть два компьютера (экземпляры приложений), P C A и P C B. Чтобы установить соединение I Я должен поместить IP-адрес P C A в P C B и IP-адрес P C B в P C A. Я хочу сделать небольшое изменение кода, где, если приложение работает на двух ПК, и они оба подключены через локальную сеть, тогда обе стороны получают IP-адрес автоматически. Как автоопределение. Так что мой лог c должен был сначала узнать IP-адрес в локальной сети с помощью команды arp -a, затем записать вывод в текстовый файл и получить только IP-адреса, которые начинаются с 192 ... и проверить экземпляр приложения на каждый адрес, используя Это решение . К сожалению, я получаю сообщение об ошибке:

Необработанное исключение: System.Runtime.InteropServices.COMException: Сервер RP C недоступен.

в системе. Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo) в System.Management.ManagementScope.InitializeGuts (объект o) в System.Management.ManagementScope.Initialize () в System.Management.ManagementObjectSearcher .ManagementObjectSearcher.Get ()

Это код, который я использовал для выполнения sh этой задачи.

//Write the cmd Output in a text file
        string strCmdText;
        strCmdText = @"/K arp -a > C:\Test\Result.txt";
        System.Diagnostics.Process.Start("CMD.exe", strCmdText);

        //To get the IP address which starts with the 192.
        const string ipPattern = @"^\s*(192\.168\.\d{1,3}\.\d{1,3}\b)";
        var ipRegex = new Regex(ipPattern);

        var ipAddresses192168 = File.ReadAllLines(@"C:\Test\Result.txt")
            .Skip(3) // Skip 3 lines
            .Where(line => ipRegex.IsMatch(line))
            .Select(line => ipRegex.Match(line).Groups[1].Value);

        foreach (var ipAddress in ipAddresses192168)
        {
            Console.WriteLine(ipAddress);

            // Check for the running instance of the application on LAN network.

            ManagementScope scope = new ManagementScope(@"\\" + ipAddress + @"\root\cimv2");
            string query = "SELECT * FROM Win32_Process WHERE Name='WavPlayer.exe'";
            var searcher = new ManagementObjectSearcher(query);
            searcher.Scope = scope;
            bool isRunning = searcher.Get().Count > 0;

        }

Итак, мой вопрос: есть ли другие прямые Выполните sh эту задачу, используя C#. net?

Я могу предоставить больше информации по этому вопросу, поэтому любая помощь приветствуется.

...