1. 程式人生 > >Qt自動獲取本機IP與TCP客戶端繫結IP和埠

Qt自動獲取本機IP與TCP客戶端繫結IP和埠

       客戶端使用特定的埠號與伺服器進行通訊,這是在進行網路程式設計開發時候經常容易遇到的問題。這篇部落格是關於網路程式設計中客戶端編寫的小總結。

繫結埠號

       在Qt的Socket開發中,有豐富的函式可以呼叫,要實現客戶端繫結指定的埠,只需要在建立Socket之後,呼叫bind(port)函式進行埠的繫結即可。

繫結IP和埠

       直接呼叫QHostAddress建構函式產生一個IP地址,呼叫bind()函式的另一個過載函式bind(IP,port)進行IP和埠的繫結。為了除錯與上網工作兩不誤,這裡有一個小技巧,將電腦網絡卡配置為多IP,客戶對除錯的IP進行繫結,同時不影響主IP的正常使用,可以參照我的部落格“”。擷取部分程式碼如下

        QHostAddress localIP = QHostAddress("30.252.22.10");
        IP = IPaddrLineEdit->text();
        port = portLineEdit->text().toInt();
        clientSocket->abort();
        if(clientSocket->bind(localIP,42005))
        {
            qDebug() << "1 LocalHost:" << localIP.toString();
            qDebug() << "2 localPort:" << clientSocket->localPort();
        }
        clientSocket->connectToHost(IP,port);

自動搜尋本機IP

       獲取本機所有IP,QNetworkInterface類中提供了一個便利的靜態函式allAddresses(),用於返回一個QHostAddress主機地址列表。參考自https://blog.csdn.net/liang19890820/article/details/52273986。下面是獲取本地IPv4的程式碼實現

    QList<QHostAddress> list = QNetworkInterface::allAddresses();
    foreach (QHostAddress address, list)
    {
        if(address.protocol() == QAbstractSocket::IPv4Protocol)
        {
            if(address.toString().contains("127.0.")) continue;

             qDebug() << "Address : " << address.toString();
        }
        else if (address.isNull())  // 主機地址為空
            continue;
    }