Qt+Windows API給指定網卡增加IP

//pro文件中加入network模塊
#include <QNetworkInterface>  
#include <QProcess>
//Windows API相關依賴
#include"iphlpapi.h"
#pragma comment(lib,"Iphlpapi.lib") 
//Windows API相關依賴
//PIP_ADAPTER_INFO結構體存儲本機網卡信息,包括本地網卡、無線網卡、虛擬網卡、外接USB網卡、藍牙 
 void AddNetInfo()
 {
    PIP_ADAPTER_INFO pAdapterInfo=(IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO); 
    char szMacAddr[20]; 
    string sDestinationMac = ""; 
    QString strName = "";
    //調用GetAdaptersInfo函數,填充pAdapterInfo指針變量,其中ulOutBufLen參數既是輸入也是輸出
    if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
    {
        //如果分配失敗,釋放後重新分配
        GlobalFree (pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
    }
    if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == NO_ERROR)
    {
        while (pAdapterInfo)
        {  
        	//這裏輸出的名稱是一個英文數字字符串,描述爲該網卡的硬件描述
			qDebug()<< QString::fromLocal8Bit("網卡名稱:") << pAdapterInfo->AdapterName << endl;
			qDebug()<< QString::fromLocal8Bit("網卡描述:") << pAdapterInfo->Description << endl;
            //pAdapter->Description中包含"PCI"爲本地網卡,pAdapterInfo->Type是6爲以太網卡
            if(strstr(pAdapterInfo->Description,"PCI") > 0|| pAdapterInfo->Type == 6)
            {
				sprintf_s(szMacAddr, 20, "%02X:%02X:%02X:%02X:%02X:%02X",
					pAdapterInfo->Address[0],
					pAdapterInfo->Address[1],
					pAdapterInfo->Address[2],
					pAdapterInfo->Address[3],
					pAdapterInfo->Address[4],
					pAdapterInfo->Address[5]);
				sDestinationMac = szMacAddr;
				qDebug()<< QString::fromLocal8Bit("MAC 地址:") << szMacAddr << endl; 
    		}
            pAdapterInfo= pAdapterInfo->Next;
        } 
    else
    {
       qDebug()<<QString("Call to GetAdaptersInfo failed")<< endl;
	    if(pAdapterInfo)
	    {
	        GlobalFree (pAdapterInfo);
	    }  
	    return;
    } 
    if(pAdapterInfo)
    {
        GlobalFree (pAdapterInfo);
    } 
 
//獲取所有網卡信息,根據已有目標網卡Mac地址匹配別名
QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces();
for each(QNetworkInterface interfaceItem, interfaceList) 
{   
	if(sDestinationMac.compare(interfaceItem.hardwareAddress().toStdString()) == 0) //與目標Mac地址一致
	{ 
		strName = interfaceItem.humanReadableName();
	}
    /*  
    //輸出每個網卡的IP等信息 
    QList<QNetworkAddressEntry> addressEntryList=interfaceItem.addressEntries();
    for each(QNetworkAddressEntry addressEntryItem, addressEntryList)
    {
         if(addressEntryItem.ip().protocol()==QAbstractSocket::IPv4Protocol)
         {  
          qDebug()<<"IP Address:"<<addressEntryItem.ip().toString(); 
          qDebug()<<"IP Mask:"<<addressEntryItem.netmask().toString();
         }
   } 
   */
} 
//IP、子網掩碼、網關
QString strCmd = QString("netsh interface ipv4 add address %1 %2 %3 %4").arg(strName).arg(QString("255.255.255.0")) .arg(QString("192.168.1.1")) ;  
QProcess::startDetached(strCmd);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章