Снифер на C# с Raw сокетом ловит не все пакеты, пропускает часть трафи

Тема в разделе ".NET", создана пользователем zklient, 2 июн 2008.

  1. zklient

    zklient New Member

    Регистрация:
    2 июн 2008
    Сообщения:
    2
    Симпатии:
    0
    Снифер на C# с Raw сокетом ловит не все пакеты.
    Копирую фильм по сети а снифер (только считает количество пакетов и объём переданных данных) неправильно указывает объём сетевого трафика и количество пакетов (кол-во проверяю по данным в состоянии сетевого интерфейса). Может кто встречался с таким глюком?

    Фрагмент кода:
    Код (Text):
    FmainSocket = new Socket( AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP );
    FmainSocket.Bind( new IPEndPoint( IPAddress.Parse( FcaptureIP ), 0 ) );
    FmainSocket.SetSocketOption( SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true );
    byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
    byte[] byOut = new byte[4];
    FmainSocket.IOControl( IOControlCode.ReceiveAll, byTrue, byOut );
    FmainSocket.BeginReceive( FreceiveBuf, 0, FreceiveBuf.Length, SocketFlags.None, new AsyncCallback( OnReceive ), null );

    private void OnReceive ( IAsyncResult _ar ) {
    int vReceived = FmainSocket.EndReceive( _ar );
    byte[] vReceiveBuf = FreceiveBuf;
    // отпарсить принятое
    ParseData( vReceiveBuf, vReceived );
    FreceiveBuf = new byte[CmaxPacketSize];
    FmainSocket.BeginReceive( FreceiveBuf, 0, FreceiveBuf.Length, SocketFlags.None, new AsyncCallback( OnReceiv ), null );
    }


    private void ParseData ( byte[] _receiveBuf, int _Received ) {
    lock(this){
    CapturedPackets++;
    CapturedBytes += _Received;
    }
    }
     
Загрузка...

Поделиться этой страницей