UDP通信 (2)

 前回作成したサーバーに対して送信を行う Metro Style App を作成します。
 機能はデスクトップアプリ版と同じです。

 デスクトップ版で使用していた UdpClient クラスは使えませんので DatagramSocket クラスを使用します。
 MessageReceived イベントに受信した時の処理を登録した後で、送信用のストリームを取得して送信データを書き込みます。
 サーバーから受信したら、データを取り出して TextBox に設定します。

 なお、data というバイト配列に対して AsBuffer というメソッドを呼び出していますが、これは byte[] を IBuffer に変換する物です。
 using で System.Runtime.InteropServices.WindowsRuntime 追加していないと使えませんので注意して下さい。

private async void sendButton_Click(object sender, RoutedEventArgs e)
{
    var socket = new DatagramSocket();

    socket.MessageReceived += socket_MessageReceived;

    var endpoint = new EndpointPair(null, "", new HostName("255.255.255.255"), "11111");
    var stream = await socket.GetOutputStreamAsync(endpoint);

    var data = Encoding.UTF8.GetBytes(sendText.Text);
    var operation = await stream.WriteAsync(data.AsBuffer());
}

void socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
    var reader = args.GetDataReader();

    var data = reader.DetachBuffer().ToArray();
    var str = Encoding.UTF8.GetString(data, 0, data.Length);

    Dispatcher.Invoke(CoreDispatcherPriority.Normal, (s, a) => recvText.Text = str, this, null);

    reader.Dispose();
    sender.Dispose();
}

 前回作成したサーバーを起動した状態で、実行してみた結果が以下の画面です。
 きちんと通信できているようです。

 なお、Metro Style App でこのような通信を行う場合は、マニフェストの"機能"で"インターネット(クライアント)"を有効にしておく必要があります。
 通常はアプリ作成時に有効になっているようなので、特に設定は必要ないと思います。

 この設定がオフになっていると、通信系の処理で例外が発生します(今回のアプリだと GetOutputStreamAsync で UnauthorizedAccessException が発生します)。