Qt下UDP編程學習,QtUDP編程學習

來源:互聯網
上載者:User

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 編程問題

這個太專業了 去你們那地方找個專業的當面問下吧
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.