Я пытаюсь сделать анализатор пакетов в C #, и я хочу написать его самостоятельно, используя только методы C #, чтобы не зависеть от других авторов.Я использую метод BeginReceiveFrom, и я ловлю только пакеты с устройства в локальной сети (192.168.0.87) и два адреса: 224.0.0.251:5353, 255.255.255.255:57621.Конечно, на устройстве в локальной сети я открывал веб-сайты, чтобы убедиться, что пакеты идут через сеть.Что я делаю не так?:-) каждая помощь приветствуется!
- Я изменил правила на брандмауэре, чтобы не блокировать свое приложение.
- Я предоставляю права администратора для своего приложения.
- Я изменил методот BeginRecive до BeginReciveFrom.
static void Sniff (IPAddress ip) {
Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
sck.Bind(new IPEndPoint(ip, 0));
sck.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
sck.IOControl(IOControlCode.ReceiveAll, new byte[4] { 1, 0, 0, 0 }, null);
byte[] buffer = new byte[24];
Action<IAsyncResult> OnReceive = null;
EndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.0.87"), 0);
OnReceive = (ar) =>
{
String sourceIp = SourceIP(buffer);
String destinationIp = DestinationIp(buffer);
if (sourceIp != ip.ToString() && destinationIp != ip.ToString())
{
Console.WriteLine(
"{0}\t{1}:{2}\t===>\t{3}:{4}"
, buffer.Skip(9).First().ToProtocolString()
, SourceIP(buffer)
, ((ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 20))).ToString()
, DestinationIp(buffer)
, ((ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 22))).ToString());
}
buffer = new byte[24]; //clean out our buffer
//sck.BeginReceive(buffer, 0, 24, SocketFlags.None, new AsyncCallback(OnReceive), null);
sck.BeginReceiveFrom(buffer, 0, 24, SocketFlags.None, ref endPoint, new AsyncCallback(OnReceive), null);
};
// sck.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endPoint, new AsyncCallback(OnReceive), null);
}
private static String SourceIP(byte[] buffer)
{
return new IPAddress(BitConverter.ToUInt32(buffer, 12)).ToString();
}
private static String DestinationIp(byte[] buffer)
{
return new IPAddress(BitConverter.ToUInt32(buffer, 16)).ToString();
}
public static string ToProtocolString(this byte b)
{
switch (b)
{
case 1: return "ICMP";
case 6: return "TCP";
case 17: return "UDP";
default: return "#" + b.ToString();
}
}
Я вижу только несколько пакетов с / на адреса 224.0.0.251:5353, 255.255.255.255:57621.Я ожидал увидеть всю связь с / на устройство в локальной сети.