1. 程式人生 > >UDP---之QT的QUdpSocket使用

UDP---之QT的QUdpSocket使用

一、概述:                                           

#include <QUdpSocket>

QUdpSocket類繼承自QAbstractSocket,該類中的所有函式都是可重入的(reentrent)【即是否加入了訊號量機制以應對多程序呼叫而不影響其結果】。

 

二、介紹:                                           

QUdpSocket公有型別:

view plaincopy to clipboardprint?

  1. 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?

  1. 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?

  1. 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