Я основал пакетный снифер на этом (часто цитированном) примере проекта. После внедрения пакетов HTTP я заметил, что только HTTP-пакеты, которые я собираю, являются запросами, я не получаю никаких ответов.
Я просмотрел много разных источников, но поскольку используемый код очень часто то же самое, я склонен думать, что он может быть локальным для меня.
Когда я смотрю на свои журналы, я вижу, что каждый пакет имеет свой локальный IP как SourceIP
, как для HTTP-пакетов, так и для пакетов, которые поступают в другие порты.
Я представил рабочий образец здесь, который вы можете скопировать-вставить в LINQPad и должен продемонстрировать проблему (добавьте сборки System.Net
и System.Net.Socket
). Не забудьте выполнить LINQPad как администратор, чтобы иметь доступ к сокету.
Это приводит к сотням/тысячам записей в диапазоне 192.168.0 с 3 исключениями IP-адресов, которые относятся к моему провайдеру хостинга (проверено с помощью nslookup
).
private readonly byte[] _data = new byte[4096];
private Socket _mainSocket;
public void Capture()
{
_mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
_mainSocket.Bind(new IPEndPoint(GetLocalIP(), 0));
var byTrue = new byte[] {1, 0, 0, 0};
var byOut = new byte[] {1, 0, 0, 0};
_mainSocket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
_mainSocket.EnableBroadcast = true;
_mainSocket.BeginReceive(_data, 0, _data.Length, SocketFlags.None, OnReceive, null);
}
private void OnReceive(IAsyncResult ar)
{
SocketError error;
var received = _mainSocket.EndReceive(ar, out error);
Parse(_data, received);
_mainSocket.BeginReceive(_data, 0, _data.Length, SocketFlags.None, OnReceive, null);
}
private void Parse(byte[] data, int size)
{
var packet = new IPHeader(data, size);
Console.WriteLine (packet.SourceIP.ToString());
}
- Windows 8.1
-
Гигабитный Ethernet-контроллер Killer e2200 (NDIS 6.30) - Последняя версия драйвера- Вчера была установлена автономная сетевая карта, она ничего не меняла.
Сообщение, которое ближе всего к моей проблеме, имеет в качестве решения рабочий код, который у меня уже есть.
Почему я могу отслеживать исходящие пакеты?