❶ QT的UDP通信編程問題
「由於是本機上的兩個程序間通話,我程序中的兩個IP地址都寫得本機,但是無法通信,而且conn變數就是0」
這里無法通信是指什麼,有錯誤提示嗎?
❷ 求助,QT網路編程中udpsocket 無法writeDatagram
路由器的埠號與你機器的埠號是不一樣的(你做了埠映射,對方沒有,他接收不到)可以有個中間伺服器,對方電腦先與伺服器通信(告知Ip和埠),你與伺服器通信(獲取對方的Ip和埠),也就是NAT穿透;路由端如何支持UPNP協議的話,應該不需要做埠映射;你可以看看UPNP協議
❸ qt socket怎麼釋放埠號
先調用Close(),然後delete(或者調用deleteLater())銷毀對象即可。
❹ qt udpsocket 是阻塞的嗎
不是阻塞的,發送是實時的,寫入IO就行了,接收會有信號上報的,信號到了直接去槽函數讀取數據就行了。
❺ 關於QT中UDP的連接問題
conn=receiver->bind(6000,QUdpSocket::ShareAddress);改成 bool result=udpSocket->bind(port);
❻ QT中socket接收到的udp報文:\uFFF1,怎麼批量轉成QString類型
摘要
❼ 如何釋放線程中創建的QUdpSocket對象
轉載很多時候需要在QThread的run中new一個QUdpSocket來收發數據.這時,這個socket對象的釋放就成了一個麻煩的問題.
如果在thread的析構中直接delete這個socket對象,則會出現如下異常:
QSocketNotifier: socket notifiers cannot be disabled from another thread
ASSERT failure in QCoreApplication::sendEvent: 「Cannot send events to objects owned by a different thread. Current thread 560cb8. Receiver 」 (of type 『QNativeSocketEngine』) was created in thread a617748″, file kernel/qcoreapplication.cpp, line 349
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
以下是解決方案:
1.在線程中定義一個線程釋放的標識
2.在run()中用while來判斷這個標識,以便於結束socket對象.
3.在thread的析構中,設定標識,並使用quit()和wait().
代碼如下:
UdpSocketThread::UdpSocketThread(QObject *parent) :
QThread(parent)
{
this->socket = 0;
this->needStop = false;
}
UdpSocketThread::~UdpSocketThread()
{
this->needStop = true;
quit();
wait();
}
void UdpSocketThread::run()
{
socket = new QUdpSocket;
connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));
socket->bind(2234);
exec();
while(this->needStop)
{
if(this->socket)
{
delete this->socket;
this->socket = 0;
}
break;
}
}
這個線程對象的釋放比較有代表性,應該可以解決很多類似的問題.
另外,方法可能還有其他的,這里只是舉了一種而已.
其實,問題的關鍵就是:線程中創建的對象就必須在線程中釋放.
PS:
經shiroki的指正,其實QT有更好的機制來釋放對象.那就是deleteLater(). 於是,事情就顯得非常簡單,請看代碼:
UdpSocketThread::UdpSocketThread(QObject *parent) :
QThread(parent)
{
socket = 0;
}
UdpSocketThread::~UdpSocketThread()
{
this->socket->deleteLater();
quit();
wait();
}
void UdpSocketThread::run()
{
socket = new QUdpSocket;
connect(socket,SIGNAL(readyRead()),this,SLOT(readPendingDatagrams()));
socket->bind(2234);
exec();
}
❽ QT中udp多線程怎麼處理
Qt上要求界面處理一般需要在主線程中完成。
所以最好把次線程中的數據緩沖區放到主線程中:
1、一種方式可以進行數據拷貝,但肯定效率低了。
2、另一種方式是直接將數據緩沖區放到主線程中,然後在主線程中處理讀取數據槽。但這樣可能主線程壓力大,機器配置不能太低。
3、直接在主線程中訪問次線程的數據並刷新界面,不過這處理起來復雜(需要手工同步),容易出錯。
4、將TableWidget指針傳入次線程中,直接在次線程中對其進行操作並發送刷新信號。這種方式未經驗證,感覺可能性不大:一方面指針容易走空,另一方面就是前面說的限制在主線程中對接面進行處理。不過所說的「處理」可能並不包括刷新數據吧。
期待樓主進行驗證,並展示結果。
❾ Qt編譯錯誤QUdpSocket:: no such file or directory
這個問題比較模稜兩可吧。不同的IDE實現Udp的方式不同,Qt中是有專門的QUdpSocket這個類,直接通過stream對象寫入到socket中,而發送的數據和接受的數據格式是一樣的,所以Qt的話是看你怎麼發的,二進制數的話不知道你是什麼意思,是char*還是確切的一個數,其實都可以的
❿ 如何用Qt的Qudpsocket傳輸圖片文件
主要是你通過socket api封裝要發送的數據,內部會自動封裝成數據流進行傳輸。
1,什麼是Socket
網路上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個埠號唯一確定。
但是,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。在Java環境下,Socket編程主要是指基於TCP/IP協議的網路編程。
2,Socket通訊的過程
Server端Listen(監聽)某個埠是否有連接請求,Client端向Server 端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。
對於一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:
(1) 創建Socket;
(2) 打開連接到Socket的輸入/出流;
(3) 按照一定的協議對Socket進行讀/寫操作;
(4) 關閉Socket.(在實際應用中,並未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因為程序本身比較簡單,要求不高,所以並未造成什麼影響。)
3,創建Socket
創建Socket
java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。這是兩個封裝得非常好的類,使用很方便。其構造方法如下:
Socket(InetAddress address, int port);
Socket(InetAddress address, int port, boolean stream);
Socket(String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(SocketImpl impl)
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
ServerSocket(int port);
ServerSocket(int port, int backlog);
ServerSocket(int port, int backlog, InetAddress bindAddr)
Socket client = new Socket("127.0.01.", 80);
ServerSocket server = new ServerSocket(80);
在創建socket時如果發生錯誤,將產生IOException,在程序中必須對之作出處理。所以在創建Socket或ServerSocket是必須捕獲或拋出例外。