【问题标题】:Count the network interfaces with WSAIoctl function (WIN32 API)使用 WSAIoctl 函数(WIN32 API)计算网络接口
【发布时间】:2009-05-14 12:00:53
【问题描述】:

我正在尝试使用 WSAIoctl 函数列出可用接口。我必须传入一个缓冲区来保存完整的列表。我想在分配内存以保存接口详细信息之前获取接口的计数,但是如果我传入一个 NULL 指针,调用就会失败(我没有得到返回的有效计数)。在我必须分配内存之前有什么方法可以得到这个计数?

背景是我正在 Windows 机器上启动大量进程/线程,它们都连接到单个服务器。我希望服务器将这些单独的连接视为来自不同的 IP 地址,并且我已向测试机器添加了大量别名以允许这样做(很多)。 WSAIoct 确实可以正确找到我添加的所有内容。

干杯...

【问题讨论】:

    标签: c++ c winapi


    【解决方案1】:

    来自 WSAIoctl 的 msdn documentation

    注意:如果输出缓冲区没有 大到足以包含地址 列表中,SOCKET_ERROR 作为 该 IOCTL 的结果和 WSAGetLastError 返回 WSAEFAULT。这 所需的大小(以字节为单位) 输出缓冲区在返回 lpcbBytesReturned 参数在这个 案子。请注意 WSAEFAULT 错误代码是 如果 lpvInBuffer 也返回, lpvOutBuffer 或 lpcbBytesReturned 参数不完全包含 在用户地址的有效部分 空间。

    所以你必须调用 WSAIoctl 函数两次。第一次使用任意缓冲区,然后检查文档中提到的错误代码。然后使用 lpcbBytesReturned 中返回的大小来分配缓冲区并再次调用 WSAIoctl 函数。

    【讨论】:

    • 嗯,这适用于 SIO_ADDRESS_LIST_QUERY,对于 SIO_GET_INTERFACE 列表,我得到了不同的答案。看看有什么区别......
    • 你是对的,我假设你使用了 SIO_ADDRESS_LIST_QUERY。我从未使用过 SIO_GET_INTERFACE,所以恐怕无法进一步帮助您。如果您找到解决方案,请告诉我们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多