private void DoReceive(ChannelRegistration registration, IActorRef handler)
{
Action <int, ByteBuffer> innerReceive = null;
innerReceive = (readsLeft, buffer) =>
{
buffer.Clear();
buffer.Limit(_udp.Setting.DirectBufferSize);
var sender = Channel.Receive(buffer);
if (sender != null)
{
buffer.Flip();
handler.Tell(new Udp.Received(ByteString.Create(buffer), sender));
if (readsLeft > 0)
{
innerReceive(readsLeft - 1, buffer);
}
}
};
var buffr = _udp.BufferPool.Acquire();
try
{
innerReceive(_udp.Setting.BatchReceiveLimit, buffr);
}
finally
{
_udp.BufferPool.Release(buffr);
registration.EnableInterest(SocketAsyncOperation.Receive);
}
}