У меня есть приложение для голосового чата с открытым исходным кодом, которое отлично работает в локальной сети.
Но проблема в том, чтобы вручную подключить два компьютера.
Предположим, есть два компьютера (экземпляры приложений), 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?
Я могу предоставить больше информации по этому вопросу, поэтому любая помощь приветствуется.