예제 #1
0
 private Datagram GetDatagram(AsyncEnumeratorContext context)
 {
     return(new Datagram(
                context.Buffer.AsMemory(context.Offset, context.Length).ToArray(),
                context.EndPoint.Address.GetAddressBytes(),
                context.EndPoint.Port));
 }
예제 #2
0
        private Try <Datagram> TrySetContext(Try <Datagram> datagram, AsyncEnumeratorContext context)
        {
            if (datagram.IsException())
            {
                return(datagram);
            }

            if (!datagram.Value.TryGetEndPoint(out var endPoint) && !datagram.Value.IsEndPointEmpty())
            {
                return(new Try <Datagram>(CreateSocketException(SocketError.AddressNotAvailable, datagram.Value)));
            }

            context.EndPoint = endPoint;

            if (!datagram.Value.Buffer.TryCopyTo(context.Buffer))
            {
                return(new Try <Datagram>(CreateSocketException(SocketError.MessageSize, datagram.Value)));
            }

            context.Length = datagram.Value.Buffer.Length;

            return(datagram);
        }
예제 #3
0
        private async ValueTask ReceiveDatagramAsync(AsyncEnumeratorContext context)
        {
            var datagram = GetDatagram(context);

            await WriteToOutputAsync(new Try <Datagram>(datagram));
        }