2012-05-28 4 views
3

Я видел несколько похожих вопросов в 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.
  • Возможно, вы также захотите внедрить новые типы исключений, так что вы можете, например, более эффективно улавливать «Нет информации маршрутизации», причина в том, что эта ошибка часто фиксируется простым ожиданием бит (чтобы открыть целевой процесс соединение), а затем повторите попытку.
+2

Если вы найдете локальную конечную точку, используемую процессом, то вы знаете, какой адаптер он использует.Вы не можете этого сделать? –

+0

Ну, я не контролирую процесс, поэтому я не уверен, как это сделать. – Xcelled194

+2

Ну 'netstat -a' дает вам локальные конечные точки, используемые процессами. Затем вам необходимо сопоставить IP с соответствующим адаптером. (Может быть, еще проще). –

ответ

2

в дополнении к Цикаде, это должно помочь вам:

Это C# обертка вокруг некоторого C/C++ кода, который получает вам список всех открытых соединений с сочетанным PID (идентификатор процесса).

http://www.timvw.be/2007/09/09/build-your-own-netstatexe-with-c/

Я считаю, что это единственный путь, определить, основываясь на исполняемом пути/имени процесса (ID) и попытаться найти текущее соединение этого процесса.

+0

Насколько хорошо это работает, если процесс имеет подключения к нескольким подсетям? –

+0

@JohnSaunders, это условие не определено. Вы потенциально получили бы все используемые адаптеры, тогда вы бы застряли в том, что вам нужно было выбрать один ... Вы могли бы «сузить его», сопоставляя как удаленные, так и локальные конечные точки, но такие поражения побеждают в использовании этот подход (поиск адаптера ** без ** зная конечный IP). К счастью, процесс, который я просматриваю, открывает только одно соединение .... – Xcelled194

+0

Я не уверен, что вы подразумеваете под «неопределенным». В целом это вполне допустимая ситуация. Если вы также чувствуете, что это действительно вообще, то я бы хотел, чтобы вы обновили свой вопрос, указав, что в вашем конкретном случае никогда не будет более одного адаптера. –

Смежные вопросы