포장 풀기 _wts_client_address.address vb.net (터미널 서비스 클라이언트에서 IP 주소 검색)

StackOverflow https://stackoverflow.com/questions/288560

문제

다음 구조가 있습니다.

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

다음 호출에 의해 채워집니다.

        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)

주소 바이트 배열이 채워지고 있지만 유용한 문자열 또는 정수 값으로 변환하는 방법을 모르겠습니다. MDSN 문서는 드물다 : http://msdn.microsoft.com/en-us/library/aa383857(vs.85).aspx

도움이 되었습니까?

해결책

당신은 거의 코드가 있습니다. 나는 당신에게 동의합니다. MSDN은 바이트 어레이 내부에 대해 명시 적이지는 않지만 다음은 다음과 같습니다.

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

처음 두 바이트는 사용되지 않는 것으로 보이지만 AF_INET (IPv4 또는 2)의 경우 다음 4 바이트는 클라이언트의 IPv4 주소입니다.

또한 코드가 IPv6 (AF_INET6)을 올바르게 처리하거나 AF_INET6이 가능성이 높다는 사실을 처리 할 수도 있습니다. 이 프로토콜에 대해 4 대신 16 바이트를 읽어야 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top