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