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());

最初の 2 バイトは使用されていないようですが、AF_INET (IPv4 または 2) の場合、次の 4 バイトはクライアントの IPv4 アドレスです。

また、コードが IPv6 (AF_INET6) を適切に処理するか、AF_INET6 が適切な値であるという事実を処理することを確認することもできます。このプロトコルでは、おそらく 4 バイトではなく 16 バイトを読み取る必要があります。

于 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 に答える