2012-12-19 40 views
2

Qt 4.8 documentation包含以下建議:使用QUdpSocket作爲QIODevice的正確方法是什麼?

如果你想使用標準的QIODevice函數讀取()的readLine(),write()方法,等等,你必須首先將插座直接連接到同行調用connectToHost()。

所以我試圖以下代碼:

udp.connectToHost(hostName, hostPort); // connected 
udp.bind(hostName, hostPort); 

當我執行此代碼,Qt的記錄以下調試消息:

QNativeSocketEngine ::綁定()中QAbstractSocket不叫:: UnconnectedState

這意味着bind要求插座在第未連接狀態。所以我嘗試了以下內容:

udp.bind(hostName, hostPort); // bound 
udp.connectToHost(hostName, hostPort); 

但是它也不起作用:套接字沒有連接到主機,它仍處於錯誤狀態。

配置QUdpSocket以將其用作QIODevice的正確方法是什麼?

+0

提到你得到的錯誤代碼。 – ismail

+0

你沒有告訴我們你有什麼確切的問題。 –

回答

4

首先將套接字綁定到特定的本地地址/端口,然後將套接字連接到特定的外部地址/端口的方法應該可行。所以第二個代碼示例是正確的。

udp.bind(hostName, hostPort); // bound 
udp.connectToHost(hostName, hostPort); 

但是,這並不Qt中工作了< 5.5.0作爲connectToHost內部使用的功能的版本總是先解開插座,並再次將其綁定到任何地址的免費本地端口。

詳情請參閱QTBUG-26538 - QUdpSocket: connectToHost() resets local port number specified by bind()

如果在使用重新實現的QIODevice方法時,將UDP套接字綁定到「連接」(UDP無連接)到特定外部名稱/端口的特定本地地址/端口很重要,則無法提供no對Qt版本< 5.5.0的此Qt錯誤的其他解決方法是使用可在Qt 5.5 commit message 102610的頁面上看到的應用補丁代碼修補(非常仔細地)使用的Qt版本的源。

相關問題