Асинхронные сокеты - обработка ложных значений socket.AcceptAsync - PullRequest
2 голосов
/ 04 января 2010

У класса Socket есть метод .AcceptAsync, который возвращает либо true, либо false.

Я думал, что ложное возвращаемое значение было условием ошибки, но в примерах, которые Microsoft предоставляет для асинхронных сокетов, они вызывают функцию обратного вызова синхронно после проверки на ошибку, как показано здесь:

public void StartAccept(SocketAsyncEventArgs acceptEventArg)
    {
        if (acceptEventArg == null)
        {
            acceptEventArg = new SocketAsyncEventArgs();
            acceptEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(AcceptEventArg_Completed);
        }
        else
        {
            // socket must be cleared since the context object is being reused
            acceptEventArg.AcceptSocket = null;
        }

        m_maxNumberAcceptedClients.WaitOne();
        bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);
        if (!willRaiseEvent)
        {
            ProcessAccept(acceptEventArg);
        }
    }

    /// <summary>
    /// This method is the callback method associated with Socket.AcceptAsync operations and is invoked
    /// when an accept operation is complete
    /// </summary>
    void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e)
    {
        ProcessAccept(e);
    }

Почему они это делают? Это побеждает назначение асинхронных сокетов и останавливает возврат метода.

Ответы [ 4 ]

4 голосов
/ 05 января 2010

Из AcceptAsync спецификации:

Возвращает false , если операция ввода / вывода завершено синхронно. SocketAsyncEventArgs.Completed Событие по параметру е не будет поднят и объект е передается как параметр может быть проверен немедленно после вызова метода возвращается получить результат операции.

Когда он возвращает false, вы должны немедленно обработать только что принятый сокет.

1 голос
/ 28 февраля 2010

Как говорит Ремус, когда он возвращает false, вы обрабатываете его синхронно, а не асинхронно.

Да, может показаться странным, что вы обрабатываете асинхронный вызов синхронно, но обычно это происходит только в том случае, если уже существует соединение, ожидающее подтверждения при вызове AcceptAsync. Поскольку там уже есть соединение, нет необходимости проходить асинхронный вызов ввода-вывода, и его синхронная обработка выполняется быстрее и использует меньше ресурсов.

0 голосов
/ 30 августа 2010

Если метод возвратил false, это означает: операция уже завершена .

Таким образом, если возвращается true , операция еще не завершена .

Подводя итог:

  • Если метод возвращает false, обработайте его немедленно.
  • Если метод возвращает true, обработайте его при возникновении события.

Надеюсь, это помогло.

0 голосов
/ 22 мая 2010

Даже вызвав Thread.Sleep в локальной сети, чтобы я был уверен, что все данные поступили от клиента, я не могу заставить AcceptAsync или ReceiveAsync возвращать значение false с параметрами сокета по умолчанию с использованием TCP. Интересно, можно ли вернуть false, используя несколько уникальных опций, или UDP, или, возможно, опцию Send with NoDelay. В любом случае, легко кодировать возможность возврата false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...