Qt下UDP編程學習,QtUDP編程學習
一、概述: #include <QUdpSocket>QUdpSocket類繼承自QAbstractSocket,該類中的所有函數都是可重新進入的(reentrent)。
二、介紹: QUdpSocket公有類型:
enumBindFlag {ShareAddress, DontShareAddress, ReuseAddressHint, DefaultForPlatform }flagsBindModeQUdpSocket公用函數:QUdpSocket ( QObject * parent = 0 ) virtual~QUdpSocket ()boolbind ( const QHostAddress & address, quint16 port )boolbind ( const QHostAddress & address, quint16 port, BindMode mode )boolbind ( quint16 port = 0 )boolbind ( quint16 port, BindMode mode )boolhasPendingDatagrams () constbooljoinMulticastGroup ( const QHostAddress & groupAddress )booljoinMulticastGroup ( const QHostAddress & groupAddress, const QNetworkInterface & iface )boolleaveMulticastGroup ( const QHostAddress & groupAddress )boolleaveMulticastGroup ( const QHostAddress & groupAddress, const QNetworkInterface & iface )QNetworkInterfacemulticastInterface () constqint64pendingDatagramSize () constqint64readDatagram ( char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0 )voidsetMulticastInterface ( const QNetworkInterface & iface )qint64writeDatagram ( const char * data, qint64 size, const QHostAddress & address, quint16 port )qint64writeDatagram ( 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()訊號。
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)。
三、成員標誌含義:
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的UDP通訊編程問題
“由於是本機上的兩個程式間通話,我程式中的兩個IP地址都寫得本機,但是無法通訊,而且conn變數就是0”
這裡無法通訊是指什麼,有錯誤提示嗎?
QT UDP Socket 編程問題
這個太專業了 去你們那地方找個專業的當面問下吧