public override void OnError(Exception error) { Debug.WriteLine(String.Format("OnChannelError ch={0}", _channel.LocalChannelID)); _channelReady.Set(); //_socket.ShutdownSend(); //_socket.ShutdownReceive(); try { _socket.ShutdownReceive(); _socket.Close(); _channel.Close(); } catch (Exception ex) { Debug.WriteLine(ex.Message); Debug.WriteLine(ex.StackTrace); } Util.InterThreadWarning(String.Format(Env.Strings.GetString("Message.Channel.ServerError"), _serverName, error.Message)); }
private void OnSocketData(IAsyncResult result) { try { int len = _socket.EndReceive(result); if (!_channelReady.WaitOne(3000, false)) { throw new IOException("channel ready timed out"); } //Debug.WriteLine(String.Format("OnSocketData ch={0} len={1}", _channel.LocalChannelID, len)); if (len <= 0) { _socket.ShutdownReceive(); _channel.SendEOF(); _channel.Close(); } else { _channel.Transmit(_buffer, 0, len); _socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(this.OnSocketData), null); } } catch (Exception ex) { Debug.WriteLine("OnSocketData catch handler" + _channel.LocalChannelID); Debug.WriteLine(ex.Message); Debug.WriteLine(ex.StackTrace); try { _channel.Close(); } catch (Exception ex2) { Debug.WriteLine("Channel Close Error"); Debug.WriteLine(ex2.Message); Debug.WriteLine(ex2.StackTrace); } try { _socket.Close(); } catch (Exception ex2) { Debug.WriteLine("Socket Close Error"); Debug.WriteLine(ex2.Message); Debug.WriteLine(ex2.StackTrace); } } }