public static Udp ReceiveStart(this Udp udp,
                                       Action <Udp, IDatagramReadCompletion> receiveAction)
        {
            if (udp is null)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.udp);
            }
            if (receiveAction is null)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.receiveAction);
            }

            udp.OnReceive(receiveAction);
            udp.ReceiveStart();

            return(udp);
        }
        public static Udp ReceiveStart(this Udp udp,
                                       IPEndPoint localEndPoint,
                                       Action <Udp, IDatagramReadCompletion> receiveAction,
                                       bool dualStack = false)
        {
            if (udp is null)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.udp);
            }
            if (localEndPoint is null)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.localEndPoint);
            }
            if (receiveAction is null)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.receiveAction);
            }

            udp.Bind(localEndPoint, dualStack);
            udp.OnReceive(receiveAction);
            udp.ReceiveStart();

            return(udp);
        }