Wireshark фактически использует Winpcap для этого, и, как показывает другой ответ, вы можете использовать его также.
Вы также можете использовать класс System.Net.Sockets.Socket
и перевести его в беспорядочный режим. Я использую это для захвата трафика IP (например, TCP и UDP) от данного сетевого интерфейса. Вот пример.
using System.Net;
using System.Net.Sockets;
Socket socket =
new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Bind(new IPEndPoint(IPAddress.Parse("X.X.X.X"), 0)); // specify IP address
socket.ReceiveBufferSize = 2 * 1024 * 1024; // 2 megabytes
socket.ReceiveTimeout = 500; // half a second
byte[] incoming = BitConverter.GetBytes(1);
byte[] outgoing = BitConverter.GetBytes(1);
socket.IOControl(IOControlCode.ReceiveAll, incoming, outgoing);
Теперь, когда сокет создан и настроен, вы можете использовать метод Receive()
, чтобы начать получать данные. Каждый раз, когда вы вызываете Receive()
, возвращаемый буфер будет содержать IP-пакет. См. здесь для разбивки заголовка IPv4, здесь для заголовка UDP и здесь для заголовка TCP. Если поле Protocol заголовка IP содержит значение 17, значит, у вас есть пакет UDP.
ПРИМЕЧАНИЕ Исходные сокеты в Windows требуют, чтобы вы были администратором в локальной системе. В этой статье MSDN .
содержится следующий язык.
Чтобы использовать сокет типа SOCK_RAW
требует административных привилегий.
Пользователи, использующие приложения Winsock
которые используют сырые сокеты должны быть членами
группы администраторов на
локальный компьютер, иначе необработанный сокет
вызовы не будут выполнены с кодом ошибки
WSAEACCES. В Windows Vista и более поздних версиях
доступ к необработанным сокетам осуществляется в
создание сокетов. В более ранних версиях
Windows, доступ для необработанных сокетов
применяется во время другого сокета
операции.