我在SMTP邮件服务器的代码中找到了以下代码(LumiSoft Mail Server)。根据方法的名称,它测试平台是否支持I/O Completion Ports。
/// <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
以异步方式执行。它甚至在另一个线程中执行。但是,当它开始执行时,此方法的finally部分已经关闭套接字并在另一个线程中导致ObjectDisposedException
。
那么,测试IOCP支持的技术是不正确的?为什么它适用于Windows?测试IOCP支持的正确方法是什么?
答案 0 :(得分:2)
测试只是确定异步操作是否导致NotSupportedException
。测试代码不关心异步操作,完成它只关心它是否在被调用时抛出异常。
编写测试的人可能认为异步操作意味着IOCP支持,并且该测试应该真正命名为“IsAsyncOperationSupported()”。
我认为由于缺乏IOCP支持,mono / linux不支持任何地方的异步操作,编写测试的人知道这一点......