/// <summary>
        /// Extends BeginReceiveMessageFrom so that when a state object is not needed, null does not need to be passed.
        /// <example>
        /// socket.BeginReceiveMessageFrom(buffer, offset, size, socketFlags, remoteEP, callback);
        /// </example>
        /// </summary>
        public static IAsyncResult BeginReceiveMessageFrom(this Socket socket, Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, AsyncCallback callback)
        {
            if(socket == null) throw new ArgumentNullException("socket");

            return socket.BeginReceiveMessageFrom(buffer, offset, size, socketFlags, ref remoteEP, callback, null);
        }
        /// <summary>
        /// Extends BeginReceiveMessageFrom so that buffer offset of 0 and call to Array.Length are not needed.
        /// <example>
        /// socket.BeginReceiveMessageFrom(buffer, socketFlags, remoteEP, callback);
        /// </example>
        /// </summary>
        public static IAsyncResult BeginReceiveMessageFrom(this Socket socket, Byte[] buffer, SocketFlags socketFlags, ref System.Net.EndPoint remoteEP, AsyncCallback callback)
        {
            if(socket == null) throw new ArgumentNullException("socket");

            if(buffer == null) throw new ArgumentNullException("buffer");

            return socket.BeginReceiveMessageFrom(buffer, 0, buffer.Length, socketFlags, ref remoteEP, callback);
        }
        public static Task<SocketReceiveMessageFromResult> ReceiveMessageFromAsync(
            this Socket socket, 
            ArraySegment<byte> buffer, 
            SocketFlags socketFlags, 
            EndPoint remoteEndPoint)
        {
            return Task<SocketReceiveMessageFromResult>.Factory.FromAsync(
                (callback, state) => socket.BeginReceiveMessageFrom(
                    buffer.Array, 
                    buffer.Offset, 
                    buffer.Count, 
                    socketFlags, 
                    ref remoteEndPoint, 
                    callback, 
                    state),
                asyncResult => {
                    IPPacketInformation ipPacket;
                    int bytesReceived = socket.EndReceiveMessageFrom(
                        asyncResult, 
                        ref socketFlags, 
                        ref remoteEndPoint, 
                        out ipPacket);

                    return new SocketReceiveMessageFromResult() {
                        PacketInformation = ipPacket,
                        ReceivedBytes = bytesReceived,
                        RemoteEndPoint = remoteEndPoint,
                        SocketFlags = socketFlags };
                },
                null);
        }