2010-11-21 34 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支持和谁写的测试知道这一点的人支持异步操作无处不在......