Frage

Ich habe die folgende Struktur:

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

, die durch den folgenden Aufruf aufgefüllt wird:

        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)

Die Adresse Byte-Array wird bevölkert, aber ich habe keine Ahnung, wie es in eine nützliche String oder Integer-Werte zu konvertieren. Die MDSN Dokumentation ist spärlich: http://msdn.microsoft .com / de-de / library / aa383857 (VS.85) aspx

War es hilfreich?

Lösung

Sie sind fast da mit Ihrem Code. Ich stimme Ihnen zu, die MSDN ist nicht ganz explizit auf, was in diesem Byte-Array ist, aber hier ist das, was Sie tun können:

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

Die ersten beiden Bytes scheinen nicht verwendet werden, aber im Fall von AF_INET (der IPv4, oder 2) die nächsten vier Bytes sind die IPv4-Adresse des Clients.

Sie können auch sicherstellen möchten, dass Ihr Code IPv6 behandelt (AF_INET6) richtig, oder die Tatsache umgehen, dass AF_INET6 ein wahrscheinlicher Wert ist. Sie werden wahrscheinlich 16 Bytes lesen müssen anstelle von 4 für dieses Protokoll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top