2008-11-13 95 views
1

我有以下结构:开箱_WTS_CLIENT_ADDRESS.Address在vb.net(从终端服务客户端获取IP地址)

<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

回答

1

你几乎在那里与你的代码。我同意你的看法,在MSDN上没有什么是字节数组里面,但这里很明确的是你可以做什么:

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

似乎前两个字节不被使用,但在AF_INET的情况下(即IPv4,或2)接下来的四个字节是客户端的IPv4地址。

您可能还想确保您的代码能够正确处理IPv6(AF_INET6),或处理AF_INET6可能的值。您可能需要为此协议读取16个字节而不是4个。