mono 3.10 Socket未知の異常な悲劇を引き起こす...

1395 ワード

最近mono 3.10のsocket性能に対するテストを行い、比較的に圧力を高くしたい場合にmonoのバグがプログラムに未知の異常を引き起こし、プログラムの終了を招く深刻な問題を発見した.

エラーメッセージ

Unhandled Exception:
System.InvalidOperationException: EndSend can only be called once per
asynchronous operation
  at System.Net.Sockets.Socket.EndSend (IAsyncResult asyncResult,
System.Net.Sockets.SocketError& errorCode) [0x00000] in <filename unknown>:0 
  at System.Net.Sockets.Socket.EndSend (IAsyncResult result) [0x00000] in
<filename unknown>:0 
  at System.Net.Sockets.SocketAsyncEventArgs.SendCallback (IAsyncResult ares)
[0x00000] in <filename unknown>:0 
  at System.Net.Sockets.SocketAsyncEventArgs.DispatcherCB (IAsyncResult ares)
[0x00000] in <filename unknown>:0
epoll(ADD): 9 Bad file descriptor

コードから見ればSocket.EndSendによる異常は処理されておらず、epollガイド面から投げ出すように見える.SocketAsyncEventArgs.SendCallbackの処理コードは次のとおりです.
internal void SendCallback (IAsyncResult ares)
		{
			try {
				BytesTransferred = curSocket.EndSend (ares);
			} catch (SocketException se){
				SocketError = se.SocketErrorCode;
			} catch (ObjectDisposedException) {
				SocketError = SocketError.OperationAborted;
			} finally {
				OnCompleted (this);
			}
		}

コードから見ると、いくつかの異常が処理されていないはずです.明らかにepool(add):9 Bad file descriptorはfile io異常であるべきです.以上のコードにはcatchがないためです.結局悲劇的なことが起こった.(問題はmonoチームに提出されました.この問題を処理してほしいです)