エクスポート (0) 印刷
すべて展開

方法: Windows Phone のソケットに関する接続情報を取得する

2012/02/09

ネットワーク対応アプリケーションは、常に使用可能なネットワークの種類を検出して、最適なアプリケーション応答速度を達成できるようにする必要があります。

Microsoft.Phone.Net.NetworkInformation 名前空間には、ソケット クラスの拡張メソッドがあります。GetCurrentNetworkInterface(Socket) メソッドを使用して、ネットワーク インターフェイスで GSM または CDMA の移動体信ネットワークを使用しているか、あるいは携帯ネットワークまたは Wi-Fi 技術を使用しているかなどの情報を取得できます。このトピックでは、ソケットの現在の接続情報を取得する方法を示します。

注注:

拡張メソッドの詳細については、「方法: 拡張メソッドを呼び出す (Visual Basic)」または「拡張メソッド (C# プログラミング ガイド)」を参照してください。

次の手順では、テストの目的でのみボタン クリック イベントにコードを配置します。作成したアプリケーションでは、必要に応じてプロパティにアクセスできます。次の手順では、button1 という名前のボタンを持つ Windows Phone アプリケーションがあることを前提としています。

ソケットに関する接続情報を取得するには

  1. ページの分離コード ファイルの先頭に、次のステートメントを追加します。

    
    using System.Net.Sockets;
    using Microsoft.Phone.Net.NetworkInformation;
    using System.Threading;
    using System.Text;
    
    
  2. ネットワーク インターフェイスに関する使用可能なすべての情報を取得するには、ソケットが接続されている必要があります。ボタン クリック イベントに次のコードを追加します。これにより、ソケットが作成され、接続の確立が試みられます。

    重要な注重要な注:

    この例を実行するには、次のコードで serverNameportNumber を変更し、この TCP ソケットで通信できるサービスとそのポートを参照します。そうしないと、接続要求に対してタイムアウトを受信します。

    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
    
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                // To run this application, you should specify the name of a server on your network that is running
                // the required service. Please replace the "Placeholder" text below.
                string serverName = "Placeholder";
    
                // This identifies the port over which to communicate. In this sample, we need to just
                // supply the Echo port number, but you are free to select your own.
                int portNumber = 7;
    
                // Create DnsEndPoint. 
                DnsEndPoint hostEntry = new DnsEndPoint(serverName, portNumber);
    
                // Create a SocketAsyncEventArgs object to be used in the connection request.
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = hostEntry;
                socketEventArg.UserToken = socket;
                socketEventArg.Completed += ShowNetworkInterfaceInformation;
    
                // // Make an asynchronous Connect request over the socket.
                socket.ConnectAsync(socketEventArg);
    
            }
    
    

    上記のメソッドでは、ShowNetworkInterfaceInformationCompleted イベント ハンドラーを割り当てます。これは、非同期ソケット接続要求が完了するかタイムアウトするときに呼び出されるコールバックです。そのメソッドで、接続が成功した場合に、すべてのネットワーク インターフェイス情報を取得します。

  3. 同じ分離コード ページで、次のメソッドを追加します。

    
            /// <summary>
            /// Display the network information using the GetCurrentNetworkInterface extension method on the socket.
            /// </summary>
            /// <remarks>This is the callback from the ConnectAsync method.</remarks>
            void ShowNetworkInterfaceInformation(object s, SocketAsyncEventArgs e)
            {
                // When ConnectAsync was called, it was passed the socket object in
                // the UserToken field of the socketEventArg. This context is retrieved once
                // the ConnectAsync has completed.
                Socket socket = e.UserToken as Socket;
    
                // Call GetCurrentNetworkInterface only if the connection was successful.
                if (e.SocketError == SocketError.Success)
                {
                    NetworkInterfaceInfo netInterfaceInfo = socket.GetCurrentNetworkInterface();
    
                    // Use a StringBuilder to efficiently build up an information text about this
                    // NetworkInterfaceInfo.
                    StringBuilder sb = new StringBuilder();
    
                    // For clarity, append a timestamp so that we can see when this information was gathered.
                    sb.AppendLine("Last Updated: " + DateTime.Now.ToString());
    
                    sb.Append("Interface Name: ");
                    sb.AppendLine(netInterfaceInfo.InterfaceName);
    
                    sb.Append("Interface State: ");
                    sb.AppendLine(netInterfaceInfo.InterfaceState.ToString());
    
                    sb.Append("Interface Type: ");
                    sb.AppendLine(netInterfaceInfo.InterfaceType.ToString());
    
                    sb.Append("Interface SubType: ");
                    sb.AppendLine(netInterfaceInfo.InterfaceSubtype.ToString());
    
                    DisplayMessage(sb.ToString(), "Network Interface Information", MessageBoxButton.OK);
                }
                else
                {
                    DisplayMessage(e.SocketError.ToString(), "Error Getting Interface Information", MessageBoxButton.OK);
                }
    
                // Close our socket since we no longer need it. 
                // The scope of this socket instance is this method. It is created every time the method is called. 
                // This was done purely to keep this method as self-contained as possible for this sample. 
                socket.Close();
            }
    
    

    上記のメソッドで、接続要求の可否は SocketAsyncEventArgsSocketError プロパティを参照して判断されます。成功した場合は、ソケット オブジェクトで GetCurrentNetworkInterface 拡張メソッドの呼び出しが行われます。単純なテキスト出力は、NetworkInterfaceInfo オブジェクトの多様なプロパティ値を組み合わせて生成されます。最後に、次のコードで説明する DisplayMessage の呼び出しが行われます。

  4. 同じ分離コード ページで、次のメソッドを追加します。

    
             /// <summary>
            /// This helper method ensures that MessageBox.Show() is called on the UI thread.
            /// </summary>
            void DisplayMessage(string text, string caption, MessageBoxButton buttonConfiguration)
            {
                Dispatcher.BeginInvoke(() =>
                {
                    MessageBox.Show(text, caption, buttonConfiguration);
                });
            }
    
    
  5. ソリューションをビルドして実行すると、次のような MessageBox が表示されます。

    「方法: 接続情報の取得」のスクリーンショット
    注注:

    上記のイメージで、Interface Subtype の値は Unknown です。ただし、携帯ネットワークに接続する場合、Wi-Fi でつないだり接続したりする代わりに、このフィールドには 2G や 3G などの携帯ネットワークの種類が表示されます。

表示:
© 2014 Microsoft