2011-06-16 32 views
3

我想使用QUdpSocket發送數據報。下面是我使用的代碼:使用QUdpSocket發送數據報

udpSocket = new QUdpSocket(this); 
QByteArray datagram = "Message"; 
udpSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress::Broadcast, 45454); 

現在,如果我說只有一個網絡適配器的計算機上運行它,它似乎沒有問題的工作。但是,如果有多個適配器,我需要能夠控制哪個用於發送數據報。我發現,如果我綁定插座如下:

udpSocket->bind(QHostAddress("192.168.1.104"), 45454); 

然後我可以強制與IP相關的本地網絡上發送出去的數據包(否則它似乎選擇一個隨機)。然而,'綁定'函數設置套接字來偵聽數據包,在這一點上我真的不感興趣。這是控制使用哪個適配器的正確方法,還是有更直接的方法來實現這一點?

感謝

回答

2

你需要像這樣

QHostAddress myBroadcastAddress = QHostAddress("192.168.255.255"); 
udpSocket->writeDatagram(datagram.data(),datagram.size(), myBroadcastAddress , 45454) 

這將發送UDP廣播數據包。

+0

感謝您的建議,但使用地址「192.168.255.255」沒有幫助。我的計算機在適配器1上的IP地址是192.168.1.104,而在適配器2上是192.168.56.1,所以我假設使用上述地址仍然會選擇錯誤的適配器。但是,如果我使用「192.168.1.255」它似乎工作。但是,我對網絡沒有太多的經驗。這將是多麼強大。也就是說,它可以在任何(大多數)系統上工作嗎?謝謝。 – 2011-06-16 14:25:45

2

子網的廣播地址始終是子網中的最高地址。你的情況:

適配器1:地址192.168.1.104子網掩碼255.255.255.0廣播:192.168.1.255

適配器2:192.168.56.1地址子網掩碼爲255.255.255.0廣播:192.168.56.255

所以你需要您想要廣播的適配器地址和子網掩碼以找到正確的廣播地址。

如果使用適配器地址和子網掩碼來計算廣播地址,這應該適用於IPv4網絡。

+0

你的意思是'QHostAddress :: Broadcast'不起作用? – EJP 2011-08-04 10:40:44

+1

QHostAddress :: Broadcast是一個始終爲255.255.255.255的常量,即通用廣播地址。不幸的是,可以在任何適配器上工作的地址不會告訴您的操作系統使用哪個適配器。 – Patrick 2011-08-04 13:12:03