SMTPメールサーバー( LumiSoft Mail Server )のコードで次のコードを見つけました。メソッドの名前に従って、プラットフォームが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サポートをテストする適切な方法は何ですか?