Распаковка _WTS_CLIENT_ADDRESS.Address в vb.net (получение IP-адреса от клиента служб терминалов) - PullRequest
1 голос
/ 14 ноября 2008

У меня есть следующая структура:

    <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

Ответы [ 2 ]

2 голосов
/ 23 ноября 2008

Ты почти со своим кодом. Я согласен с вами, MSDN не совсем ясно, что внутри этого байтового массива, но вот что вы можете сделать:

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

Первые два байта, похоже, не используются, но в случае AF_INET (то есть IPv4 или 2) следующие четыре байта являются IPv4-адресом клиента.

Возможно, вы также захотите убедиться, что ваш код будет правильно обрабатывать IPv6 (AF_INET6), или учитывать тот факт, что AF_INET6 является вероятным значением. Вам, вероятно, потребуется прочитать 16 байтов вместо 4 для этого протокола.

1 голос
/ 16 декабря 2009
...