// 受信したメッセージをエコーバックする
        private async void EchoMessage(RemotePeer peer, DatagramSocketMessageReceivedEventArgs args)
        {
            if (!peer.IsMatching(args.RemoteAddress, args.RemotePort))
            {
                NotifyUserFromAsyncThread(
                    string.Format(
                        "Got datagram from {0}:{1}, but already 'connected' to {2}",
                        args.RemoteAddress,
                        args.RemotePort,
                        peer),
                    NotifyType.ErrorMessage);
            }

            try
            {
                await peer.OutputStream.WriteAsync(args.GetDataReader().DetachBuffer());
            }
            catch (Exception exception)
            {
                if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown)
                {
                    throw;
                }
                NotifyUserFromAsyncThread("Send failed with error: " + exception.Message, NotifyType.ErrorMessage);
            }
        }
        // Listenerがメッセージを受信したときのハンドラ
        private async void MessageReceivedAsync(Windows.Networking.Sockets.DatagramSocket socket, DatagramSocketMessageReceivedEventArgs args)
        {
            if (CoreApplication.Properties.TryGetValue("remotePeer", out var outObj))
            {
                EchoMessage((RemotePeer)outObj, args);
                return;
            }

            try
            {
                // SenderのアドレスとポートからOutputStreamを取得
                var outputStream = await socket.GetOutputStreamAsync(
                    args.RemoteAddress,
                    args.RemotePort);

                RemotePeer peer;
                lock (this)
                {
                    if (CoreApplication.Properties.TryGetValue("remotePeer", out outObj))
                    {
                        peer = (RemotePeer)outObj;
                    }
                    else
                    {
                        peer = new RemotePeer(outputStream, args.RemoteAddress, args.RemotePort);
                        CoreApplication.Properties.Add("remotePeer", peer);
                    }
                }

                EchoMessage(peer, args);
            }
            catch (Exception exception)
            {
                if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown)
                {
                    throw;
                }

                NotifyUserFromAsyncThread("Connect failed with error: " + exception.Message, NotifyType.ErrorMessage);
            }
        }