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();
}
}
正常に動作するようですが、モノラル/ Linux上で失敗します。メソッドSendToAsync
は、その名前のように、非同期に実行されます。別のスレッドでも実行されます。しかし、実行が開始されると、このメソッドの最後の部分はすでにソケットを閉じ、もう1つのスレッドのObjectDisposedException
を引き起こします。
IOCPをサポートするかどうかをテストする方法は間違っていますか?なぜWindows上で動作しますか? IOCPサポートをテストする適切な方法は何ですか?
...モノ/ linuxのが原因IOCPのサポートの欠如と、これを知っているテストを書いた人にどこでも非同期操作をサポートしていないことを想像I/O完了ポートは、非同期のサポートは異なっています。 IOCPはWindows固有です。 LinuxはIOCPではなく 'epoll()'を使います。 –
モノはIOCPをエミュレートします。 https://bugzilla.novell.com/show_bug.cgi?id=644428を参照してください。 – Meinersbur