信息
您所需的主题如下所示。但此主题未包含在此库中。
此主题尚未评级 - 评价此主题

如何获取有关 Windows Phone 套接字的连接信息

2012/2/9

网络感知应用程序需要能够随时检测可用的网络类型,以便它们能够提供最佳的应用程序响应。

Microsoft.Phone.Net.NetworkInformation 命名空间向套接字类提供扩展方法。您可以使用 GetCurrentNetworkInterface(Socket) 方法获取信息,例如网络接口是使用 GSM 还是 CDMA 手机网络,或者网络接口是使用手机网络技术还是 WLAN 技术。本主题演示如何检索套接字的当前连接信息。

注意注意:

有关扩展方法的更多信息,请参阅如何调用扩展方法 (Visual Basic)扩展方法(C# 编程指南)

在下面的步骤中,您可以仅出于测试目的将代码置于一个按键的点按事件中。在您自己的应用程序中,您可以在任何需要的位置访问属性。在下面的步骤中,假设您拥有一款 Windows Phone 应用程序,且该应用程序的一个页面包含名为 button1 的按钮。

获取有关套接字的连接信息

  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);
    
            }
    
    

    在前面的方法中,我们将 Completed 事件处理程序分配到 ShowNetworkInterfaceInformation。这是在异步套接字连接请求完成或超时时调用的回调。在该方法中,如果连接成功,我们会获取所有的网络接口信息。

  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();
            }
    
    

    在前面的方法中,通过查看 SocketAsyncEventArgs 上的 SocketError 属性来确定连接请求是否成功。如果成功,则会对套接字对象上的 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

    “如何获取连接信息”的屏幕截图
    注意注意:

    在上面的图像中,界面子类型的值为“未知”。但是,当连接到手机网络时,此字段不是通过 WLAN 叠接或连接,而是显示手机网络类型(例如 2G 和 3G)。

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft. 版权所有。