Информация об удаленных IP-адресах - PullRequest
3 голосов
/ 22 января 2011

Я хочу отслеживать все IP-адреса, с которыми общается мой компьютер.Я использую C # и Visual Studio.Есть один listBox, в который я помещу все удаленные IP-адреса.Я новичок в сетевом программировании, поэтому мне нужно какое-то руководство по поводу такой проблемы.

Мой вопрос: как это сделать?Как получить информацию об удаленных IP-адресах, к которым мой компьютер подключается?

Ответы [ 4 ]

3 голосов
/ 22 января 2011

Вы можете использовать команду netstat для получения информации о том, с какими IP-адресами и портами взаимодействует ваша машина.Вы можете запускать эту команду на регулярной основе и анализировать вывод текста.

Например, следующая команда выведет состояние всех соединений, включая сведения о локальных и удаленных соединениях:

C:\Users\chibacity>netstat -a -n

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    10.0.0.107:32495       209.85.229.125:5222    ESTABLISHED
  TCP    10.0.0.107:32507       209.85.229.125:5222    ESTABLISHED
  TCP    10.0.0.107:32520       209.85.229.18:443      ESTABLISHED
  TCP    10.0.0.107:32755       209.85.227.109:993     ESTABLISHED
  //etc...

Или, если у вас есть права администратора, вы также можете получить исполняемые данные:

PS C:\Windows\system32> netstat -a -n -b

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    10.0.0.107:32495       209.85.229.125:5222    ESTABLISHED
 [googletalk.exe]
  TCP    10.0.0.107:32507       209.85.229.125:5222    ESTABLISHED
 [chrome.exe]
  TCP    10.0.0.107:32520       209.85.229.18:443      ESTABLISHED
 [chrome.exe]
  TCP    10.0.0.107:32755       209.85.227.109:993     ESTABLISHED
  //etc...

Вы можете вызвать эту команду из .Net, используя System.Diagnostics.Process и проанализировать вывод текста, например:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx

2 голосов
/ 22 января 2011

В Windows есть вспомогательная библиотека IP, iphlpapi , которая может обнаружить информацию об открытых соединениях на вашем компьютере.В частности, вы хотите взглянуть на функции GetTcpTable и GetUdpTable.

Проблема в том, что это C API.Чтобы использовать их из C #, необходимо использовать P / Invoke API.Это тривиальная задача, но она может занять некоторое время.Каждую из используемых структур C необходимо переписать на C #, используя пространство имен System.Runtime.InteropServices для их маршалинга.Многое из этого может быть автоматизировано или выполнено путем украшения структурных полей с правильными атрибутами, но могут быть случаи, когда вам нужно упорядочить структуру вручную.

Для функций C, которые вы импортируете, нужно пометить [DllImport("iphlpapi.dll")]любые другие соответствующие атрибуты в зависимости от импортируемой вами функции.Вы можете прочитать больше о PInvoke на msdn и, возможно, найти некоторые уже написанные импорты на pinvoke wiki .Кроме того, есть инструмент, который может попытаться автоматизировать большую часть его для вас, Pinvoke Interop Assitant

2 голосов
/ 22 января 2011

Большинство приложений для программирования сокетов используют API сокетов TCP, который примерно стандартизирован между операционными системами. Если вы просто хотите написать простой сервер и визуализировать, как клиенты общаются с вашим сервером, работающим в вашем процессе, это довольно просто. Однако ваш процесс не может видеть, как соединения сокетов взаимодействуют с другими процессами на вашем компьютере с помощью стандартного API сокетов.

Если вы хотите получить доступ ко всем IP-адресам, о которых говорит вся машина, вам придется использовать API более низкого уровня. Это не стандартизировано между ОС. Для Windows я посмотрю на Winsock API, чтобы узнать, сможете ли вы найти, как посмотреть на стек tcp / ip ОС. Это становится более сложным, потому что TCP-соединения проходят поверх IP-пакетов. На каком уровне вы хотите посмотреть? Просто TCP или все протоколы, которые также используют IP. ARP, UDP, TCP, ICMP, чтобы назвать стандартные представления.

Если вы только учитесь, то просто работаете на простом сервере, и все соединения, взаимодействующие с этим сервером в вашем процессе, намного проще. Понижение - это быстрый прыжок в глубокий конец. Не то чтобы я говорил, что ты не должен этого делать. Хотели бы вы, чтобы все было просто, и оставайтесь со связями, о которых говорит ваш процесс, или вы хотите пойти в лес глубокого темного Окна? Выбери свое приключение.

Редактировать: Лучшим вариантом для доступа более низкого уровня является WinPcap с оболочкой C #. Это позволит вам получить необработанную информацию о пакете. Даже пусть вы переводите свой компьютер в беспорядочный режим и отслеживаете весь трафик в вашей подсети, а не только на ПК.

1 голос
/ 22 января 2011

Если у вас есть ObservableCollection<string> mAccessInfo где-то в вашем коде как публично видимая переменная, привязанная к вашему списку, вы можете поместить это в ту часть кода, где вы слушаете соединения:

Socket socketForClient = tcpListener.AcceptSocket( );

if (socketForClient.Connected)
{
    mAccessInfo.Add(socketForClient.RemoteEndPoint.ToString());
    //do other stuff...
}

Поскольку это ObservableCollection, при каждом новом подключении, которое входит в список, список, к которому вы привязаны, обновляется.

Редактировать : Как отметил Коди Грей, это не будет работать, если у вас есть IP-адреса между прокси / маршрутизатором / NAT и т. Д. ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...