c - WTS_CLIENT_ADDRESS 地址无法正确打印

标签 c windows winapi

我正在尝试获取登录到计算机的所有 RDP 连接的 IP 地址。我正在使用 WTSEnumerateSessions 和 WTSQuerySessionInformation 来检索指向包含该地址的 WTS_CLIENT_ADDRESS 结构的指针。这是部分代码:

WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,
                           SessionNo,
                           WTSClientAddress,
                           &ppBuffer,
                           &pBytesReturned);

address = (WTS_CLIENT_ADDRESS *)ppBuffer;

if (AF_INET == address->AddressFamily)
{
    printf("Client Address : %s\n", (LPSTR)address->Address);
}
else if (AF_INET6 == address->AddressFamily)
{
    //print IPV6
}

我可以获得 AddressFamily 并且该值很好,但是当我尝试打印该地址时,我得到了乱码。 MSDN 说该值是一个以 null 结尾的字符串,但它只是不会像应有的那样打印。这是链接:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa383857(v=vs.85).aspx

我有一种感觉,我在这里错过了一些东西。

最佳答案

您没有考虑 WTS_INFO_CLASS 中的以下注释文档:

WTSClientAddress
The network type and network address of the client. For more information, see WTS_CLIENT_ADDRESS.

The IP address is offset by two bytes from the start of the Address member of the WTS_CLIENT_ADDRESS structure.

此外,无论文档如何规定,IPv4 地址都不是以 null 结尾的字符串!它实际上是 IPv4 地址的原始 4 个字节(就像 IPv6 地址是原始字节一样)。

试试这个:

WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,
                           SessionNo,
                           WTSClientAddress,
                           &ppBuffer,
                           &pBytesReturned);

address = (WTS_CLIENT_ADDRESS *)ppBuffer;

if (AF_INET == address->AddressFamily)
{
    printf("Client Address : %d.%d.%d.%d\n",
        address->Address[2], address->Address[3], address->Address[4], address->Address[5]);
}
else if (AF_INET6 == address->AddressFamily)
{
    //print IPV6
}

关于c - WTS_CLIENT_ADDRESS 地址无法正确打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36751066/

相关文章:

c - 包含函数的 .h 文件

windows - 您使用什么工具在 Linux 上开发 Windows 移动应用程序?

winapi - CCombobox : how to set text color of Editable area text when combobox style is dropdown in win32

winapi - 使用 Windows GetDIBits 函数获取位图像素值

C - 检索大于 8 位的 child 的退出状态

c - 这个递归 GCD 函数正确吗?

java - 测试网络文件夹是否存在

windows - Windows 是否确保内存只包含一份与 Linux 中相同的 dll 副本?

c - 将结构传递给 C 中的函数

C++ Tweetnacl 散列文件而不将整个文件读入内存