1

我有以下结构:

    <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

4

2 回答 2

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 个字节。

于 2008-11-23T00:03:19.017 回答
1

真正的答案可以在这里找到。http://www.tech-archive.net/Archive/Windows/microsoft.public.windows.terminal_services/2007-03/msg00474.html

于 2009-12-15T22:33:41.070 回答