2008-11-13 5 views
1

Je la structure suivante:Déballer _WTS_CLIENT_ADDRESS.Address dans vb.net (récupération d'adresse IP du client Terminal Server)

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

qui est peuplée par l'appel suivant:

 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) 

L'adresse tableau d'octets est rempli, mais je n'ai aucune idée de la façon de le convertir en une chaîne utile ou des valeurs entières. La documentation MDSN est éparse: http://msdn.microsoft.com/en-us/library/aa383857(VS.85).aspx

Répondre

1

Vous êtes presque là avec votre code. Je suis d'accord avec vous, le MSDN est pas tout à fait explicite sur ce qui est à l'intérieur de ce tableau d'octets, mais voici ce que vous pouvez faire:

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

Les deux premiers octets ne semblent pas être utilisés, mais dans le cas de AF_INET (qui est IPv4, ou 2) les quatre octets suivants sont l'adresse IPv4 du client.

Vous pouvez également vous assurer que votre code traitera IPv6 (AF_INET6) correctement, ou gérer le fait que AF_INET6 est une valeur probable. Vous aurez probablement besoin de lire 16 octets au lieu de 4 pour ce protocole.

Questions connexes