1

我正在尝试创建一个程序来实现与在 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);
        }
    }
}
4

0 回答 0