我正在尝试创建一个程序来实现与在 Windows 中运行命令 ipconfg /all 相同的功能。我已经设法实现了几乎所有的功能,但是我很难获得租约到期的正确日期和时间。我试图通过调用 GetAdapterInfo 并从返回的 PIP_ADAPTER_INFO 对象中获取 LeaseExpires 的值来获取此信息。然而,lease expires 的值不仅与 ipconfig /all 显示的值不匹配,而且在每次运行程序时也会发生变化。谁能发现为什么会发生这种情况?
#include <WinSock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#pragma comment(lib, "Iphlpapi.lib")
PIP_ADAPTER_INFO getAdaptersInfo();
void outputFormatedTime(time_t * ttp);
int main()
{
PIP_ADAPTER_INFO pai = getAdaptersInfo();
if (pai)
{
for (; pai != NULL; pai = pai->Next)
{
if (pai->DhcpEnabled && pai->LeaseObtained)
{
printf("Lease Obtained: %llu - ", pai->LeaseObtained);
outputFormatedTime(&pai->LeaseObtained);
printf("Lease Expires: %llu - ", pai->LeaseExpires);
outputFormatedTime(&pai->LeaseExpires);
}
}
HeapFree(GetProcessHeap(), 0, pai);
pai = NULL;
}
return 0;
}
PIP_ADAPTER_INFO getAdaptersInfo()
{
PIP_ADAPTER_INFO paiResult;
ULONG ulOutputBufferLength = sizeof(IP_ADAPTER_INFO);
paiResult = (IP_ADAPTER_INFO *)HeapAlloc(GetProcessHeap(), 0, sizeof(IP_ADAPTER_INFO));
if (paiResult == NULL)
{
printf("Error allocating memory needed to call GetAdaptersInfo\n");
return paiResult;
}
if (GetAdaptersInfo(paiResult, &ulOutputBufferLength) == ERROR_BUFFER_OVERFLOW)
{
HeapFree(GetProcessHeap(), 0, paiResult);
paiResult = (IP_ADAPTER_INFO *)HeapAlloc(GetProcessHeap(), 0, ulOutputBufferLength);
if (paiResult == NULL)
{
printf("Error allocating memory needed to call GetAdaptersInfo\n");
return paiResult;
}
}
if (!GetAdaptersInfo(paiResult, &ulOutputBufferLength) == NO_ERROR)
{
printf("Error calling GetAdaptersInfo\n");
HeapFree(GetProcessHeap(), 0, paiResult);
paiResult = NULL;
return paiResult;
}
return paiResult;
}
void outputFormatedTime(time_t * ttp)
{
struct tm newtime;
char buffer[32];
errno_t error;
error = _localtime32_s(&newtime, (__time32_t *)ttp);
if (error)
{
printf("Invalid Argument to _localtime32_s\n");
}
else
{
error = asctime_s(buffer, 32, &newtime);
if (error)
{
printf("Invalid Argument to asctime_s\n");
}
else
{
printf("%s", buffer);
}
}
}