c++ - 使用 NEW 而不是 MALLOC 的 GetAdapterAddresses 函数

标签 c++ network-programming winsock

我会使用 Windows 的 GetAdaptersAddresses() 函数来获取有关计算机适配器的一些信息。在 this MSDN 页面有一个很大的例子说明如何使用它。但我使用的是 C++,所以我会坚持使用 new 关键字而不是 malloc(C native)。如何用 new 重写使用 malloc 的部分?

编辑 1

std::vector<PIP_ADAPTER_ADDRESSES> buffer;
ULONG outBufferLen = 0;

if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &outBufferLen) == ERROR_BUFFER_OVERFLOW)
{
    buffer.resize(outBufferLen);

    PIP_ADAPTER_ADDRESSES addresses = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(buffer.data());

    if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, addresses, &outBufferLen) == NO_ERROR)
    {
        for (; addresses != NULL; addresses = addresses->Next)
        {
            ...
        }
    }
}

编辑 2

ULONG outBufferLen = 0;

if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &outBufferLen) == ERROR_BUFFER_OVERFLOW)
{
    PIP_ADAPTER_ADDRESSES p = new IP_ADAPTER_ADDRESSES[outBufferLen / sizeof(IP_ADAPTER_ADDRESSES)];

    if (GetAdaptersAddresses(AF_INET, GAA_FLAG_INCLUDE_PREFIX, NULL, p, &outBufferLen) == NO_ERROR)
    {
        ....
    }
}

最佳答案

您不能使用new/delete 直接重写该代码,因为引入new 会引发异常风险,而该代码不会异常安全。一个愚蠢的方法是调用 ::operator new(size_t, const nothrow_t&) 而不是 malloc() - 但这真的很难看。

真正的解决方案是使用适当的 C++ 类重写所有代码。 std::vector 非常适合pAddresses,您需要一个用于 lpMsgBuf 的 RAII 包装器。

关于c++ - 使用 NEW 而不是 MALLOC 的 GetAdapterAddresses 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8259439/

相关文章:

c++ - 如何从同样具有 'main' 的 .cpp 源文件中链接函数?

sockets - 在 OpenSSL 上使用带有 UDP 套接字的 DTLS 时,如何正确处理连接和 SSL session ?

c - UDP 客户端显示 'UDP Connected' 而没有 UDP 服务器在本地主机上运行

Java:如何在没有异常的情况下停止服务器(关闭套接字)?

c# - 连接到 C# 服务器的 C++ 套接字

Ruby:对 Winsock2 ioctlsocket 的 Win32API 调用失败,地址错误?

c++ - 3D C++ 任意网格三角剖分库?

c++ - 日期格式的时间标记?

c++ - 客户端套接字可绑定(bind)但不可连接,因为已在使用中

c++ - 如何在 objective-c 中表达 (5 x 5.4 10-3)