2010-11-21 35 views
2

我在SMTP郵件服務器(LumiSoft Mail Server)的代碼中找到了以下代碼。根據方法的名稱,它測試平臺是否支持I/O Completion PortsI/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就像它的名字所說的那樣,是異步執行的。它甚至在另一個線程中執行。但是,當它開始執行時,此方法的最後一部分已關閉套接字,並在另一個線程中導致ObjectDisposedException

那麼,測試IOCP支持是否是一種不正確的技術?它爲什麼在Windows上工作?測試IOCP支持的正確方法是什麼?

+0

I/O完成端口是異步的支持不同。 IOCP是特定於Windows的。 Linux使用'epoll()'而不是IOCP。 – 2010-11-22 04:39:42

+0

單聲道模擬IOCP。請參閱https://bugzilla.novell.com/show_bug.cgi?id=644428 – Meinersbur 2010-11-22 21:54:53

回答

2

該測試簡單地確定異步操作是否導致NotSupportedException或不。測試代碼不關心完成它的異步操作,只是在被調用時拋出異常。

編寫測試的人可能認爲異步操作意味着IOCP支持,並且此測試應該真正命名爲「IsAsyncOperationSupported()」。

我想,單聲道/ Linux並不因缺乏IOCP支持和誰寫的測試知道這一點的人支持異步操作無處不在......