방법: Windows Phone의 소켓에 대한 연결 정보 가져오기

2012-02-09

네트워크 인식 응용프로그램은 최적 응용프로그램 응답성을 제공할 수 있도록 항상 사용 가능한 네트워크 종류를 검색할 수 있어야 합니다.

Microsoft.Phone.Net.NetworkInformation 네임스페이스는 Socket 클래스에 확장 메서드를 제공합니다. 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);
    
            }
    
    

    앞의 메서드에서는 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();
            }
    
    

    앞의 메서드에서 연결 요청의 성공은 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가 표시됩니다.

    방법: 연결 정보 가져오기 스크린샷
    참고참고:

    앞의 이미지에서 인터페이스 하위 유형의 값은 "알 수 없음"입니다. 하지만 Wi-Fi를 통해 테더링되거나 연결되는 대신 셀룰러 네트워크에 연결된 경우에는 이 필드에 2G, 3G 등의 셀룰러 네트워크 유형이 표시됩니다.

표시: