private void OnReceive(IAsyncResult result)
{
ClientState state = (ClientState)result.AsyncState;
try
{
int bytesReceived = state.Stream.EndRead(result);
if (bytesReceived == 0)
{
state.Dispose();
return;
}
if (_receiveCallback != null)
{
_receiveCallback(state.ReceiveBuffer, bytesReceived, state.Stream);
}
else
{
// Echo back what we received
state.Stream.Write(state.ReceiveBuffer, 0, bytesReceived);
}
// Read more from client (asynchronous)
state.Stream.BeginRead(state.ReceiveBuffer, 0, state.ReceiveBuffer.Length, OnReceive, state);
}
catch (IOException)
{
state.Dispose();
return;
}
catch (SocketException)
{
state.Dispose();
return;
}
catch (ObjectDisposedException)
{
state.Dispose();
return;
}
catch (InvalidOperationException e)
{
throw new InvalidOperationException(
$"Exception in {nameof(DummyTcpServer)} created with stack: {_creationStack}",
e);
}
}