QT获取设备网络类型

enum NetType {
    Wireless,  // 无线
    Wired,     // 网线
    Other,   // 未知
};
int netType()
{
    NetType nettype = Other;
#ifdef Q_OS_WIN
    PIP_ADAPTER_INFO pAdapterInfo;
    PIP_ADAPTER_INFO pAdapter = NULL;

    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(sizeof(IP_ADAPTER_INFO));
    if (pAdapterInfo == NULL) {
        return NetType::Other;
    }

    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        FREE(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *)MALLOC(ulOutBufLen);
        if (pAdapterInfo == NULL) {
            return NetType::Other;
        }
    }

    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR) {
        pAdapter = pAdapterInfo;
        while (pAdapter) {
            QString adapterDesc = QString::fromLocal8Bit(pAdapter->Description);
            QString ipAddress   = QString::fromLocal8Bit(pAdapter->IpAddressList.IpAddress.String);
            QString gatewayMask = QString::fromLocal8Bit(pAdapter->GatewayList.IpAddress.String);
            QString ipMask      = QString::fromLocal8Bit(pAdapter->IpAddressList.IpMask.String);

            // capture the useful local network address
            if (ipMask != "0.0.0.0" && gatewayMask != "0.0.0.0" && ipAddress != "0.0.0.0" && !adapterDesc.contains("VMware", Qt::CaseInsensitive)) {
                switch (pAdapter->Type) {
                case MIB_IF_TYPE_ETHERNET:
                    nettype = Wired;
                    break;
                case IF_TYPE_IEEE80211:
                    nettype = Wireless;
                    break;
                default:
                    break;
                }

                break;
            }
            pAdapter = pAdapter->Next;
        }
    }

    if (pAdapterInfo) {
        FREE(pAdapterInfo);
    }
#endif
    return nettype;
}

你可能感兴趣的:(QT实战项目应用,QT实用基础)