2008-11-13 2 views
1

I의 구조는 다음과 같습니다포장 풀기 _WTS_CLIENT_ADDRESS.Address (터미널 서비스 클라이언트에서 검색 할 IP 주소)

 Dim _ClientIPAddress As New _WTS_CLIENT_ADDRESS 
     Dim rtnPtr As IntPtr 
     Dim rtncount As Int32 

     NativeMethods.WTSQuerySessionInformation(CInt(NativeMethods.WTS_CURRENT_SERVER_HANDLE), NativeMethods.WTS_CURRENT_SESSION, NativeMethods.WTS_INFO_CLASS.WTSClientAddress, rtnPtr, rtncount) 
     '_ClientIPAddress() 
     _ClientIPAddress = _ 
      CType(System.Runtime.InteropServices.Marshal.PtrToStructure(rtnPtr, GetType(_WTS_CLIENT_ADDRESS)), _WTS_CLIENT_ADDRESS) 

주소 : 다음의 호출에 의해 채워집니다

<StructLayout(LayoutKind.Sequential)> _ 
    Public Structure _WTS_CLIENT_ADDRESS 
     Public AddressFamily As Integer 
     <MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> _ 
     Public Address() As Byte 
    End Structure 

바이트 배열이 채워지지만 유용한 문자열 또는 정수 값으로 변환하는 방법을 알지 못합니다. MDSN 설명서는 희박합니다. http://msdn.microsoft.com/en-us/library/aa383857(VS.85).aspx

답변

1

코드가 거의 있습니다. (처음 두 바이트를 사용하지 않는 것

IPAddress address = new IPAddress(_ClientIPAddress.Address.Skip(2).Take(4).ToArray()); 

을하지만, AF_INET의 경우 : 나는 당신과 동의는 MSDN 여기에 그 바이트의 배열 안에, 그러나 무엇에 확실히 명시되지는 당신이 무엇을 할 수 즉 IPv4이거나 2) 다음 4 바이트는 클라이언트의 IPv4 주소입니다.

코드가 IPv6 (AF_INET6)을 올바르게 처리하는지 확인하거나 AF_INET6이 가능한 값이라는 사실을 처리하고자 할 수 있습니다. 이 프로토콜에서는 4 대신 16 바이트를 읽어야 할 것입니다.