Socket.BeginReceive вопрос относительно цикла против рекурсивного вызова - PullRequest
0 голосов
/ 16 октября 2018

При обнаружении IP-адреса на плате сетевого адаптера Socket.BeginReceive не автоматически сигнализирует о вызове для захвата всех входящих IP-пакетов?Почему помещение в цикл while (true) дает больше результатов по сравнению с рекурсивным вызовом?

Я имею в виду, что BeginReceive должен быть асинхронным неблокированным вызовом, поэтому однократного вызова достаточно для продолжения прослушивания.в этом сокете да?

Но, похоже, это неправильная интерпретация, потому что помещение этого в цикл while (true) дает больше результатов, чем рекурсивный вызов из функции обратного вызова.

И также, если вставка этого в цикл while (true) является допустимым, который в основном опрашивает этот IP-адрес для входящих запросов, то разве не возможно, что этот метод все еще может потерять некоторую информацию?Так что на самом деле это не является обязательным на аппаратном уровне?

Например, зачем это делать:

while (true)
{
    //sets the byte array buffer, byte offset (start), byte size, etc...
    socket.BeginReceive(p_PacketBuffer, 0, p_PacketBufferSize, SocketFlags.None, new AsyncCallback(OnReceive), this);

     while (socket.Available == 0)
     {
         Thread.Sleep(1);
     }
}

private void OnReceive(IAsyncResult ar)
{
    try
    {
        //read the data from client socket
        int bytesRead = socket.EndReceive(ar);
        if (bytesRead > 0)
        {
            var objState = (Sentry.Adapters)ar.AsyncState;
            Task.Run(() =>
            {
                //clear the array from current state object
                PacketHandler pkHandler = new PacketHandler(packetRecEvent, ref objState.p_PacketBuffer);
                Array.Clear(objState.p_PacketBuffer, 0, objState.p_PacketBuffer.Length);
            });
        }
    }
    catch (Exception ex)
    {
        Logging.Add("INFO Socket Error: " + ex.Message);
    }
}

против

socket.BeginReceive(p_PacketBuffer, 0, p_PacketBufferSize, SocketFlags.None, new AsyncCallback(OnReceive), this);

private void OnReceive(IAsyncResult ar)
{
    try
    {
        //read the data from client socket
        int bytesRead = socket.EndReceive(ar);
        if (bytesRead > 0)
        {
            var objState = (Sentry.Adapters)ar.AsyncState;
            Task.Run(() =>
            {
                //clear the array from current state object
                PacketHandler pkHandler = new PacketHandler(packetRecEvent, ref objState.p_PacketBuffer);
                Array.Clear(objState.p_PacketBuffer, 0, objState.p_PacketBuffer.Length);
            });

            socket.BeginReceive(p_PacketBuffer, 0, p_PacketBufferSize, SocketFlags.None, new AsyncCallback(OnReceive), this);
        }
    }
    catch (Exception ex)
    {
        Logging.Add("INFO Socket Error: " + ex.Message);
    }
}

// ========================================================================= ОБНОВЛЕНИЕ // ===============================================================================

От выполнениямного исследований и чтения, похоже, что рекурсивный вызов .BeginReceive используется только тогда, когда есть конкретный клиент, от которого вы ожидаете запрос и отправляете.

Но так как функция .EndReceive блокируется, пока вседанные поступают, я действительно не уверен, что это все еще правильный путь, и я убежден, что любой, кто рекурсивно реализовал этот способ, может потерять входящие данные, так как .EndReceive может блокировать до тех пор, пока все исходное сообщение не будет отправлено.Полностью поступил вызов BeginReceive?

Чем больше я это читаю, тем более надежным считается метод while (true).

И действительно .BeginReceive / .EndReceive - это большеLike асинхронная схема опроса на определенном IP-адресе, чтобы получить информацию, проходящую через.Я не совсем уверен, действительно ли эти методы блокируют передачу сообщений через определенный IP-адрес в карте сетевого адаптера, поскольку похоже, что эти методы могут просто «прослушивать» этот конкретный IP-адрес и порт (-ы).

Любой Сетевой Гуру хочет взвесить это?

спасибо!

...