目標:實現一個界面發送,另一個界面接收
參考:yafeilinux
目標界面:
思路:
- 發送界面
首先,在頭文件裏面聲明一個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.
- 接收界面
第一步與發送界面一致
第二步除了進行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,衷心感謝!