Проверка поддержки порта завершения ввода-вывода

Я нашел следующий код в коде почтового сервера SMTP (LumiSoft Mail Server) . Согласно названию метода он проверяет, поддерживает ли платформа I / O Порты завершения.

/// <summary>
/// Gets if IO completion ports supported by OS.
/// </summary>
/// <returns></returns>
public static bool IsIoCompletionPortsSupported()
{
    Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
    try{                            
        SocketAsyncEventArgs e = new SocketAsyncEventArgs();
        e.SetBuffer(new byte[0],0,0);
        e.RemoteEndPoint = new IPEndPoint(IPAddress.Loopback,111);
        s.SendToAsync(e)

        return true;
    }

    catch(NotSupportedException nX){
        string dummy = nX.Message;
        return false;
    }
    finally{
        s.Close();
    }
}

Кажется, что он работает нормально, но не работает в Mono / Linux. Метод SendToAsync, как следует из его названия, выполняется асинхронно. Он даже выполняется в другом потоке. Однако, когда он начинает выполняться, часть finally этого метода уже закрывает сокет и вызывает ObjectDisposedException в другом потоке.

Итак, это неправильный метод проверки поддержки IOCP? Почему это работает в Windows? Как правильно проверить поддержку IOCP?


person Meinersbur    schedule 21.11.2010    source источник
comment
Порт завершения ввода-вывода отличается от поддержки Async. IOCP зависит от Windows. Linux использует epoll(), а не IOCP.   -  person J-16 SDiZ    schedule 22.11.2010
comment
Моно эмулирует IOCP. См. bugzilla.novell.com/show_bug.cgi?id=644428.   -  person Meinersbur    schedule 23.11.2010


Ответы (1)


Тест просто определяет, приводит ли асинхронная операция к NotSupportedException или нет. Тестовый код не заботится о завершении асинхронной операции, просто заботится о том, генерирует ли он исключение при вызове.

Человек, который написал тест, вероятно, предполагает, что асинхронные операции подразумевают поддержку IOCP и что этот тест действительно должен называться «IsAsyncOperationSupported ()».

Я полагаю, что mono / linux не поддерживает асинхронные операции везде из-за отсутствия поддержки IOCP, и человек, который написал тест, знает это ...

person Len Holgate    schedule 22.11.2010