QT 網絡與通信之客戶端(UDP)以及TCP和UDP比較

  1. 獲得本機網絡信息
    QHostInfo::localHostName(); 獲得主機信息
    QList<QHostAddress> listAddress = hostInfo.addresses();獲得主機的IP地址列表

    QString detail="";
    QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();    // 獲得主機的IP地址和網絡接口列表
    for(int i=0;i<list.count();i++)
    {
        QNetworkInterface interface=list.at(i);
        detail=detail+tr("設備:")+interface.name()+"\n";                 // 獲得網絡接口的名稱
        detail=detail+tr("硬件地址:")+interface.hardwareAddress()+"\n";  // 獲得網絡接口的硬件地址
        QList<QNetworkAddressEntry> entryList=interface.addressEntries();// 獲得每個網絡接口包括0或多個IP地址,包括子網掩碼和廣播地址
        for(int j=1;j<entryList.count();j++)
        {
            QNetworkAddressEntry entry=entryList.at(j);
            detail=detail+"\t"+tr("IP 地址:")+entry.ip().toString()+"\n";
            detail=detail+"\t"+tr("子網掩碼:")+entry.netmask().toString() +"\n";
            detail=detail+"\t"+tr("廣播地址:")+entry.broadcast().toString() +"\n";
        }
    }
    QMessageBox::information(this,tr("Detail"),detail);
    
  2. 基於UDP的工作原理
    UDP發送的是報文,報文大小不能超過64KB;
    UDP通信不與服務器建立連接,只負責調用發送函數向服務器發送數據報。服務器也從不接受連接,只負責調用接收函數,等待客戶端的數據到達。
    QT中通過QUdpSocket實現UDP協議的編程。
    在這裏插入圖片描述
    服務器端發送信息

    udpSocket = new QUdpSocket(this);
    port = 5555;// 指定UDP廣播端口號
    QString msg = TextLineEdit->text();// 發送信息
    int length=0;
    if(msg=="")
    {
    	return;
    }
    if((length=udpSocket->writeDatagram(msg.toLatin1(),
    msg.length(),QHostAddress::Broadcast,port))!=msg.length())
    {
    	return;
    }
    

    客戶端接受信息

    port =5555;                                                      // 設置UDP的端口號參數,指定在此端口上監聽數據
    udpSocket = new QUdpSocket(this);                                // 創建一個QUdpSocket
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));// 連接QIODevice的readyRead()信號
    bool result=udpSocket->bind(port);                               // 綁定到指定的端口上,result爲false時端口不可用
    
    void UdpClient::dataReceived()
    {
    	while(udpSocket->hasPendingDatagrams())                          // 判斷是否有數據報可讀,hasPendingDatagrams方法至少有一個數據報可讀是返回true
    	{
        		QByteArray datagram;
        		datagram.resize(udpSocket->pendingDatagramSize());       // 獲得第一個數據報長度
        		udpSocket->readDatagram(datagram.data(),datagram.size());// 讀取數據報
        		QString msg=datagram.data();                             // 數據內容
    	}
    }
    
  3. 基於TCP的工作原理
    TCP傳輸控制協議(Transmission Control Protocol)是一種可靠的、面向連接、面向數據流的傳輸協議。
    HTTP/FTP等高層應用協議以TCP爲基礎。
    TCP適合連續數據傳輸。
    在這裏插入圖片描述

  4. TCP與UDP的比較
    在這裏插入圖片描述

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