Как создать неблокирующие сокеты C # Compact Framework - PullRequest
0 голосов
/ 19 апреля 2011

Я пытаюсь создать неблокирующий сокет в WM6 C #, но постоянно получаю следующую ошибку компилятора:

"Синхронные вызовы не поддерживаются на неблокирующих сокетах. Установите Blocking = true или используйтеасинхронные методы. "

Однако при использовании асинхронных методов BeginReceive () EndReceive () блокируется.То же самое для BeginSend () и EndSend ().Как вы делаете неблокирующий сокет в компактной среде?

Вот мой код.Я не использую метод AsyncCallback, потому что хочу вернуть переменные bytesRecv и bytesSent.

    private void asyncReceive(byte[] recvBytes, int offset, int size, SocketFlags sf)
    {
        IAsyncResult asyncResult = null;
        int recvBytes = 0;

        try
        {
            asyncResult = _socket.BeginSend(sendBytes, offset, size, sf, null, null);
            recvBytes = _socket.EndSend(asyncResult);  // <-- This blocks even with _socket.Blocking = false;
        }
        catch (SocketException)
        {
            //Check SocketException.ErrorCode...
        }

        return recvBytes;
    }  

1 Ответ

2 голосов
/ 19 апреля 2011

Похоже, вы упускаете суть - поведение, которое вы видите, является дизайном. Я бы посоветовал почитать об асинхронном программировании в .NET (много ресурсов - может быть, начать здесь ). Неблокирующее чтение / запись сокета с помощью BeginXXX позволит вам запустить отправку / получение, затем сделать что-то еще и получить уведомление от ядра, когда это будет сделано (через AsyncCallback), после чего вы вызовете соответствующий метод EndXXX. чтобы получить результат. Если вы вызываете EndXXX сразу после вызова BeginXXX до завершения операции, он блокируется до завершения.

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

...