UDP入門學習II

目標:實現一個界面發送,另一個界面接收
參考:yafeilinux
目標界面:
發送界面
接收界面
思路:

  1. 發送界面
    首先,在頭文件裏面聲明一個UDP套接字變量和一個按鈕槽函數
    這裏寫圖片描述
    然後,在構造函數裏面定義UDP套接字變量和將按鈕槽函數進行手動連接
    這裏寫圖片描述
    最後,編寫按鈕槽函數的實現,要用到writeDatagram()函數來發送報文
void Widget::on_Button_clicked(){
    QByteArray datagram = "hello world!";
    sender->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45454);

};

注:(1)值得注意的是,這裏的地址使用了QHostAddress::Broadcast值,它對應IPv4下的廣播地址,如果將該值更換成單機地址(如本機地址QHostAddress::LocalHost或者QHostAddress(“10.21.11.66”)),將變成一個普通的點對點的UDP程序。
(2)對於端口號,它是可以隨意指定的,但是一般1024以下的端口號通常屬於保留端口號,所以我們最好使用大於1024的端口,最大爲65535。我們這裏使用了45454這個端口號,一定要注意,在下面要講的服務器程序中,也要使用相同的端口號。
(3)writeDatagram()函數的原型爲qint64 writeDatagram(const char *data,qint64 size,const QHostAddress &address,quint16 port),發送成功返回字節數,失敗返回-1.

  1. 接收界面
    第一步與發送界面一致
    這裏寫圖片描述
    第二步除了進行UDP套接字的定義和手動連接槽函數之外,還要將接收套接字與端口、IP進行bind
    receiver = new QUdpSocket(this);//爲變量receiver申請從當前地址開始的一段內存。
    receiver->bind(45454, QUdpSocket::ShareAddress);//採用ShareAddress模式(即允許其它的服務連接到相同的地址和端口,特別是用在多客戶端監聽同一個服務器端口時特別有效)
    connect(receiver, SIGNAL(readyRead()), this, SLOT(processPendingDatagram()));//此處的readRead信號表示接收套接字接收到了數據

第三步:編寫接收槽函數的實現

void Widget::processPendingDatagram(){
     while(receiver->hasPendingDatagrams())  //
    {
       QByteArray datagram; //
//讓datagram的大小爲等待處理的數據報的大小,這樣才能接收到完整的數據
       datagram.resize(receiver->pendingDatagramSize());
       //接收數據報,將其存放到datagram中
       receiver->readDatagram(datagram.data(),datagram.size());
       //將數據報內容顯示出來
       ui.label->setText(datagram);
    }   

};

注:/* readDatagram 函數原型
qint64 readDatagram(char *data,qint64 maxSize,QHostAddress *address=0,quint16 *port=0)

部分知識參考:Wuyuan’s Blog,衷心感謝!

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