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();
}
}
它似乎工作正常,但在Mono/Linux上失敗。方法SendToAsync
就像它的名字所說的那樣,是異步執行的。它甚至在另一個線程中執行。但是,當它開始執行時,此方法的最後一部分已關閉套接字,並在另一個線程中導致ObjectDisposedException
。
那麼,測試IOCP支持是否是一種不正確的技術?它爲什麼在Windows上工作?測試IOCP支持的正確方法是什麼?
I/O完成端口是異步的支持不同。 IOCP是特定於Windows的。 Linux使用'epoll()'而不是IOCP。 – 2010-11-22 04:39:42
單聲道模擬IOCP。請參閱https://bugzilla.novell.com/show_bug.cgi?id=644428 – Meinersbur 2010-11-22 21:54:53