// 受信したメッセージをエコーバックする 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); } }