private void OnReadCompleted(object sender, SocketAsyncEventArgs e)
{
if (e.BytesTransferred == 0 || e.SocketError != SocketError.Success)
{
try
{
_socket.Close();
}
catch
{
//close it.
}
HandleRemoteDisconnect(e.SocketError, null);
return;
}
if (BufferPreProcessor != null)
{
var read = BufferPreProcessor(this, _readArgsWrapper);
if (read > 0)
{
var newCount = _readArgsWrapper.BytesTransferred - read;
var newOffset = _readArgsWrapper.Offset + read;
_readArgsWrapper.SetBuffer(newOffset, newCount);
_readArgsWrapper.BytesTransferred -= read;
}
}
try
{
// pre processor can have read everything
if (_readArgsWrapper.BytesTransferred > 0)
_decoder.ProcessReadBytes(_readArgsWrapper);
}
catch (Exception exception)
{
ChannelFailure(this, exception);
// Cleanup before both pending operations have exited.
try
{
if (!_socket.Connected)
return;
}
catch (NullReferenceException)
{
//rare case of race condition during cleanup.
return;
}
}
ReadAsync();
}