在vb.net中解压缩_WTS_CLIENT_ADDRESS.Address(从终端服务客户端检索IP地址)

时间:2008-11-13 22:25:16

标签: .net vb.net client ip-address terminal-services

我有以下结构:

    <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 个答案:

答案 0 :(得分:2)

你的代码几乎就在那里。我同意你的观点,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 :(得分:1)