UDP---之QT的QUdpSocket使用
一、概述:
#include <QUdpSocket>
QUdpSocket類繼承自QAbstractSocket,該類中的所有函式都是可重入的(reentrent)【即是否加入了訊號量機制以應對多程序呼叫而不影響其結果】。
二、介紹:
QUdpSocket公有型別:
view plaincopy to clipboardprint?
- enum BindFlag {ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform }flags BindModeQUdpSocket公共函式:QUdpSocket ( QObject * parent = 0 ) virtual ~QUdpSocket ()bool bind ( const QHostAddress & address, quint16 port )bool bind ( const QHostAddress & address, quint16 port, BindMode mode )bool bind ( quint16 port = 0 )bool bind ( quint16 port, BindMode mode )bool hasPendingDatagrams () constbool joinMulticastGroup ( const QHostAddress & groupAddress )bool joinMulticastGroup ( const QHostAddress & groupAddress, const QNetworkInterface & iface )bool leaveMulticastGroup ( const QHostAddress & groupAddress )bool leaveMulticastGroup ( const QHostAddress & groupAddress, const QNetworkInterface & iface )QNetworkInterface multicastInterface () constqint64 pendingDatagramSize () constqint64 readDatagram ( char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0 )void setMulticastInterface ( const QNetworkInterface & iface )qint64 writeDatagram ( const char * data, qint64 size, const QHostAddress & address, quint16 port )qint64 writeDatagram ( const QByteArray & datagram, const QHostAddress & host, quint16 port )
QUdpSocket描述:
QUdpSocket提供了UDP套接字API,用來接收和傳送UDP資料報。
QUdpSocket類最通用的使用方式是:用bind()函式繫結一個IP地址和埠Port,然後呼叫writeDatagram()和readDatagram()函式傳輸資料。如果要使用QIODevice中的read(), readLine(), write()等函式,必須首先呼叫connectToHost()函式,直接建立一個和對方的連線。
只要向網路寫入了一個數據報,SOCKET就產生一個bytesWritten()訊號,如果僅僅是傳送資料報,無需呼叫bind()。
資料報到來,readyRead()訊號被產生,此時hasPendingDatagrams()函式返回真(true)。呼叫pendingDatagramSize()獲取第一個資料報的長度(size),readDatagram()讀取資料報內容。
注意:接收到readyRead()訊號後,應當讀取該資料報,否則下一個資料報到來後將不再產生readyRead()訊號。
view plaincopy to clipboardprint?
- Example:void Server::initSocket(){ udpSocket = new QUdpSocket(this); udpSocket->bind(QHostAddress::LocalHost, 7755); connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));}void Server::readPendingDatagrams(){ while (udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); processTheDatagram(datagram); }}
QUdpSocket類也支援UPD組播(multicast)。joinMulticastGroup()和leaveMulticastGroup()用來控制組成員,QAbstractSocket::MulticastTtlOption和QAbstractSocket::MulticastLoopbackOption分別用來設定socket的TTL和迴環(loopback)選項,setMulticastInterface()用來為組播資料報設定對外介面,multicastInterface()來獲取該介面型別:IP_MULTICAST_IF對應IPv4,IPV6_MULTICAST_IFIPv6。
通過QUdpSocket類,還可以使用connectToHost()建立和UDP伺服器的虛擬連線,然後使用read()和write()交換資料,而不必為每一個數據報都指定接收者(receiver)。
三、成員標誌含義:
view plaincopy to clipboardprint?
- enum QUdpSocket::BindFlagflags QUdpSocket::BindMode
BindFlag 這些值可以組成不同的標誌,傳遞給QUdpSocket::bind()函式來修改bind()的特性。
BindMode 是typedef for QFlags<BindFlag>。它是BindFlag值得或操作。
常量定義 |
值 |
描述 |
QUdpSocket::ShareAddress |
0x1 |
1、允許其他服務繫結同樣的地址和埠 2、當多程序通過監聽同一地址和埠,進而共享單個服務的負載時,將十分有用(例如:一個擁有幾個預先建立的監聽者的WEB伺服器能夠改善響應時間)。不過,由於任何服務都允許重新繫結(rebind),該選項應該引起某些安全上的考慮 3、需要注意的是,把該選項和ReuseAddressHint結合,也會允許你的服務重新繫結一個已存在的共享地址 4、在Unix上,該選項等同於SO_REUSEADDR;在Windows上,該選項被忽略 |
QUdpSocket::DontShareAddress |
0x2 |
1、採用專有的方式繫結某個地址和埠,其他任何服務都不能再重新繫結 2、通過該選項,確保繫結成功,指定的服務將是地址和埠唯一監聽者,就算是擁有ReuseAddressHint的服務也不允許重新繫結 3、在安全性上,該選項優於ShareAddress,但是在某些作業系統上需要管理員的許可權才能執行 4、在Unix和Mac OS上,繫結地址和埠的預設行為是非共享,所以該選項會被忽略;在Windows上,等同於SO_EXCLUSIVEADDRUSE套接字選項 |
QUdpSocket::ReuseAddressHint |
0x4 |
1、為QUdpSocke提供提示,即在地址和埠已經被其他套接字繫結的情況下,也應該試著重新繫結 2、在Unix上,該選項被忽略;在Windows上等同於SO_REUSEADDR 套接字選項 |
QUdpSocket::DefaultForPlatform |
0x0 |
1、當前平臺的預設選項 2、在Unix和Mac OS上,該選項等同於DontShareAddress + ReuseAddressHint;在Windows上等同於ShareAddress |
分類: qt_IO,qt_network