Я нашел следующий код в коде почтового сервера 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?
epoll()
, а не IOCP. - person J-16 SDiZ   schedule 22.11.2010