Тест для поддержки порта завершения ввода / вывода - PullRequest
2 голосов
/ 22 ноября 2010

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

/// <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?

1 Ответ

2 голосов
/ 22 ноября 2010

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

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

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

...