c # Packet Sniffer - это нормально, что сниффер пропускает пакеты? - PullRequest
0 голосов
/ 14 мая 2019

Я создал анализатор пакетов c #, используя Raw Sockets. Я замечаю это, когда отправляю какое-либо сообщение из клиентской TCP-программы в серверную TCP-программу и нумерую эти сообщения, например, от 1 до 50.

Серверная программа TCP получает все сообщения от 1 до 50, но прослушиватель, прослушивающий этот ip, получает только случайное сообщение, скажем 5, а затем 7,8 и т. Д. ...

Это нормально для необработанного анализатора сокетов в c #? Является ли это пределом для Raw Socket в c # и нужно ли переходить на более низкоуровневую инфраструктуру, такую ​​как pCap и т. Д.?

Заранее спасибо!

КОД (показаны все критические части, исключая библиотеку, которая выполняет синтаксический анализ пакетов, аналогичный проектам кода:

Таким образом, приведенный ниже код показывает шаги, предпринимаемые от нажатия кнопки запуска до обработки пакетов, которые прослушиваются по определенному IP-адресу. Я могу перехватить данные, но, как я уже сказал, когда я экспериментирую с TCP-клиентом и сервером, я не в состоянии перехватить все сообщения, отправляемые и получаемые между клиентским и серверным приложениями TCP, только некоторые из них обрабатываются взял. Скажем, я запускаю от 1 до 50 сообщений между клиентскими и серверными приложениями TCP. TCP-сервер и клиент забирают их все, но прослушиватель, который прослушивает один и тот же IP-адрес, только принимает некоторые сообщения, такие как 1, 5, 6, 10 и т. д. Он имеет пробелы. Опять же, это нормально для приложения анализатора или оно должно получать ВСЕ тот же трафик, который получают приложения клиента и сервера TCP?

    private const int p_PacketBufferSize = 65536; // this is the Maximum size that a packet will ever be
    private byte[] p_PacketBuffer = new byte[p_PacketBufferSize]; //Packet Buffer

    private void btnStart_Click(object sender, EventArgs e)
    {
        if (btnStart.Text.ToLower() == "start")
        {
            btnStart.Text = "Stop";

            //set ip address to bind outside of async task begin
            string interfaceName = lstAdapters.SelectedValue.ToString();
            string ipVal = lstIpAddress.SelectedValue.ToString();
            Task.Run(async () =>
            {
                bool status = await StartListening(ipVal, interfaceName);
                return status;
            });
        }
        else
        {
            btnStart.Text = "Start";
            adp.StopTraffic();
        }
    }

    private Task<bool> StartListening(string ipVal, string interfaceName)
    {
        try
        {
            IPHostEntry ipHost = Dns.GetHostEntry(ipVal);
            string domainName = ipVal;
            if (!string.IsNullOrEmpty(ipHost.HostName))
            {
                domainName = ipHost.HostName;
            }
            SetText(null, "============================================================================================================\r\n"
                    + "INTERFACE: (" + interfaceName + ") - IP ADDRESS: (" + ipVal + ") - DOMAIN NAME: (" + domainName + ")\r\n"
                    + "============================================================================================================\r\n");

            //process monitoring
            adp.MonitorTraffic(ipVal, packetRecEvent);
        }
        catch (Exception ex)
        {
            Logging.Add("Error Initializing IP Monitoring: " + ex.Message + " (" + ipVal + ")");
            MessageBox.Show("Error Occurred: " + ex.Message + " (" + ipVal + ")");
        }

        return Task.FromResult(true);
    }


    public void MonitorTraffic(string ipVal, PacketReceiveEvent pkRecEv)
    {
        //set continue capturing traffic flag
        bContinueCapturing = true;
        packetRecEvent = pkRecEv;
        try
        {
            //initialize a new socket
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
            socket.Bind(new IPEndPoint(IPAddress.Parse(ipVal), 0));
            socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);

            byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
            byte[] byOut = new byte[4] { 1, 0, 0, 0 };
            socket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);
            while (bContinueCapturing)
            {
                socket.BeginReceive(p_PacketBuffer, 0, p_PacketBufferSize, SocketFlags.None, new AsyncCallback(OnReceive), null);
                while (socket.Available == 0)
                {
                    Thread.Sleep(1);
                }
            }
        }
        catch (Exception ex)
        {
            Logging.Add("ERROR: on topmost level starting server listener: " + ex.Message);
        }
        finally
        {
            if (socket != null)
            {
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
        }
    }

    private void OnReceive(IAsyncResult ar)
    {
        try
        {
            instanceCounterThread++;
            //read the data from client socket
            int bytesRead = socket.EndReceive(ar);
            if (bytesRead > 0)
            {
                //clear the array from current state object
                PacketHandler pkHandler = new PacketHandler(packetRecEvent, p_PacketBuffer, bytesRead);
                //p_PacketBuffer = new byte[p_PacketBufferSize];
            }

            instanceCounterThread--;
            //Logging.Add("DEBUG: " + instanceCounterThread.ToString());
            if ((instanceCounterThread == 0) && (!bContinueCapturing))
            {
                packetRecEvent.fire(null, "============================================================================================================\r\n\r\n");
            }
        }
        catch (Exception ex)
        {
            if (ex.Message.ToLower().IndexOf("disposed") < 0)
            {
                Logging.Add("INFO Socket Error: " + ex.Message);
                //MessageBox.Show("Error: " + ex.Message);
            }
        }
    }

1 Ответ

0 голосов
/ 16 мая 2019

Я решил эту проблему. Это была проблема с тем, как я управлял входящими буферными данными и управлял потоками для каждого процесса.

спасибо.

...