Disimballaggio di _WTS_CLIENT_ADDRESS.Address in vb.net (recupero dell'indirizzo IP dal client di Servizi terminal)

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

Domanda

Ho la seguente struttura:

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

Che viene popolato dalla seguente chiamata:

        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)

L'array di byte di indirizzi viene popolato, ma non ho idea di come convertirlo in una stringa utile o in valori interi. La documentazione MDSN è scarsa: http://msdn.microsoft .com / it-it / library / aa383857 (VS.85) aspx

È stato utile?

Soluzione

Sei quasi arrivato con il tuo codice. Sono d'accordo con te, l'MSDN non è abbastanza esplicito su cosa c'è dentro quell'array di byte, ma ecco cosa puoi fare:

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

I primi due byte non sembrano essere utilizzati, ma nel caso di AF_INET (che è IPv4 o 2) i successivi quattro byte sono l'indirizzo IPv4 del client.

Puoi anche assicurarti che il tuo codice gestirà correttamente IPv6 (AF_INET6) o che AF_INET6 sia un valore probabile. Probabilmente dovrai leggere 16 byte anziché 4 per questo protocollo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top