Я видел несколько похожих вопросов в Google, но ничто точно не соответствует тому, что я пытаюсь сделать. Я делаю программу сокращения отставания (для игры), которая в основном снижает MTU пользователя, когда определенный процесс открыт, и восстанавливает его, когда процесс закрывается. Тем не менее, MTU является специфическим для сетевого адаптера, а некоторые пользователи имеют несколько подключенных сетевых адаптеров. С этой целью я подумал, что было бы неплохо, если бы программа также обнаружила, какой адаптер используется в игре, и только измените MTU на этом адаптере.Определите, какой сетевой адаптер использует процесс
Игра будет использовать только один адаптер за один раз.
Я не могу жестко закодировать IP-адреса конечного сервера, потому что они меняются довольно часто. Кажется, что должен быть способом определить, какой адаптер использует другой процесс, не зная конечного IP-адреса, но я не могу найти его.
EDIT: Благодаря Цикаде и Ремко я решил проблему.
я использовал класс ManagedIPHelper, что Ремко связанный с (ManagedIpHelper) и комментарии цикады привели меня к этой статье (Identifying active network interface)
Объединение тех, с некоторыми (Насти, ужасно неоптимизированная) LINQ, я получил этот фрагмент кода, который принимает имя процесса и возвращает используемый сетевой интерфейс, или null, если он не может его найти.
private NetworkInterface getAdapterUsedByProcess(string pName)
{
Process[] candidates = Process.GetProcessesByName(pName);
if (candidates.Length == 0)
throw new Exception("Cannot find any running processes with the name " + pName + ".exe");
IPAddress localAddr = null;
using (Process p = candidates[0])
{
TcpTable table = ManagedIpHelper.GetExtendedTcpTable(true);
foreach (TcpRow r in table)
if (r.ProcessId == p.Id)
{
localAddr = r.LocalEndPoint.Address;
break;
}
}
if (localAddr == null)
throw new Exception("No routing information for " + pName + ".exe found.");
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
IPInterfaceProperties ipProps = nic.GetIPProperties();
if (ipProps.UnicastAddresses.Any(new Func<UnicastIPAddressInformation, bool>((u) => { return u.Address.ToString() == localAddr.ToString(); })))
return nic;
}
return null;
}
тестирование подтверждает это работает отлично! Большое спасибо, ребята!
сторона отмечает, кто использует этот фрагмент кода:
- Вам понадобятся классы ManagedIpHelper.
- Возможно, вам будет необходимо запросить повышение, в зависимости от ситуации.
- Несколько запущенных процессов (думаю, Chrome) вернет неопределенный результат. Если вы собираетесь использовать этот код с ситуацией с многоуровневым процессом, I высоко рекомендую вам изменить , используя (Process p = candidates [0]) для более конкретного фильтра, то есть на основе PID.
- Возможно, вы также захотите внедрить новые типы исключений, так что вы можете, например, более эффективно улавливать «Нет информации маршрутизации», причина в том, что эта ошибка часто фиксируется простым ожиданием бит (чтобы открыть целевой процесс соединение), а затем повторите попытку.
Если вы найдете локальную конечную точку, используемую процессом, то вы знаете, какой адаптер он использует.Вы не можете этого сделать? –
Ну, я не контролирую процесс, поэтому я не уверен, как это сделать. – Xcelled194
Ну 'netstat -a' дает вам локальные конечные точки, используемые процессами. Затем вам необходимо сопоставить IP с соответствующим адаптером. (Может быть, еще проще). –