2010-11-21 8 views
2

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?

+0

I/O Completion-Port unterscheidet sich von Async Unterstützung. IOCP ist Windows-spezifisch. Linux benutzt 'epoll()', nicht IOCP. –

+0

Mono emuliert IOCP. Siehe https://bugzilla.novell.com/show_bug.cgi?id=644428 – Meinersbur

Antwort

2

Der Test bestimmt einfach, ob eine asynchrone Operation zu NotSupportedException führt oder nicht. Der Test-Code kümmert sich nicht um die asynchrone Operation, die abgeschlossen wird, kümmert sich nur darum, ob beim Aufruf eine Ausnahme ausgelöst wird.

Die Person, die den Test schrieb, nimmt wahrscheinlich an, dass asynchrone Operationen IOCP-Unterstützung implizieren und dass dieser Test wirklich "IsAsyncOperationSupported()" heißen sollte.

denke ich, dass Mono/Linux nicht asynchroner Operationen überall aufgrund des Fehlens von IOCP Unterstützung nicht unterstützt und die Person, die den Test dieser schrieb weiß ...