2010-11-21 11 views
2

SMTPメールサーバー(LumiSoft Mail Server)のコードに次のコードが見つかりました。メソッドの名前に従って、プラットフォームがI/O Completion Portsをサポートしているかどうかをテストします。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(); 
    } 
} 

正常に動作するようですが、モノラル/ Linux上で失敗します。メソッドSendToAsyncは、その名前のように、非同期に実行されます。別のスレッドでも実行されます。しかし、実行が開始されると、このメソッドの最後の部分はすでにソケットを閉じ、もう1つのスレッドのObjectDisposedExceptionを引き起こします。

IOCPをサポートするかどうかをテストする方法は間違っていますか?なぜWindows上で動作しますか? IOCPサポートをテストする適切な方法は何ですか?

+0

...モノ/ linuxのが原因IOCPのサポートの欠如と、これを知っているテストを書いた人にどこでも非同期操作をサポートしていないことを想像I/O完了ポートは、非同期のサポートは異なっています。 IOCPはWindows固有です。 LinuxはIOCPではなく 'epoll()'を使います。 –

+0

モノはIOCPをエミュレートします。 https://bugzilla.novell.com/show_bug.cgi?id=644428を参照してください。 – Meinersbur

答えて

2

このテストでは、非同期操作の結果がNotSupportedExceptionかどうかを単純に判断します。テストコードは非同期操作を気にしません。これを完了すると、呼び出されたときに例外をスローした場合に気になります。

テストを書いた人は、おそらく非同期操作がIOCPサポートを意味し、このテストは実際には "IsAsyncOperationSupported()"という名前であることを前提としています。

私は

関連する問題