Ich fand den folgenden Code im Code eines SMTP-Mail-Servers (LumiSoft Mail Server). Gemäß dem Namen der Methode wird getestet, ob die Plattform I/O Completion Ports unterstützt.Test für E/A Completion Port Unterstützung
/// <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();
}
}
Es scheint gut zu funktionieren, aber scheitert an Mono/Linux. Die Methode SendToAsync
wird, wie ihr Name sagt, asynchron ausgeführt. Es wird sogar in einem anderen Thread ausgeführt. Wenn es jedoch zu starten beginnt, hat der abschließende Teil dieser Methode den Socket bereits geschlossen und verursacht einen ObjectDisposedException
im anderen Thread.
Also, ist eine falsche Technik für IOCP Unterstützung zu testen? Warum funktioniert es unter Windows? Was ist der richtige Weg, um auf IOCP-Unterstützung zu testen?
I/O Completion-Port unterscheidet sich von Async Unterstützung. IOCP ist Windows-spezifisch. Linux benutzt 'epoll()', nicht IOCP. –
Mono emuliert IOCP. Siehe https://bugzilla.novell.com/show_bug.cgi?id=644428 – Meinersbur