2009年3月5日 星期四

Qt - QSocketNotifier

在最在研究如何用Qt來寫影像傳輸。
因為,之前學長寫的是用Qt3來修改IHU(I hear you)在原本base在tcp/udp上的應用程式,變成base在sctp上,並且可以完成handover的機制。

而我目前的目標是把影像的部分加進去。

因為Qt通常是你設定好機制之後,丟給Qt系統,系統會幫把把結果顯示出來。
而我Qt的部分是在client端,去讀取server的資料,並且顯示在client的面板上。

因此當client與server端建立連線之後,我必需要馬上讀取server端的資料。

就像我上面所說的,因為,我已經把控制權交給Qt去做了,那我怎麼知道server端有把資料送過來哩?

這個時候就要透過QSocketNotifier來監控,使得當client有東西要接收時,可以去執行相對應的函數。

這裡要記錄一下QSocketNotifier的使用方式。

也可以參考QSocketNotifier的官方說明文件
目前我只有使用到監測Read的部分,同時要注意的是要監控的是connect file descriptor

client的部分就是
::connect( connfd, (struct sockaddr*)&sa,sizeof(sa) );
而就是要監控connfd

而server的部分就是
connfd = ::accept(listenfd,(struct sockaddr *)&client_address, &client_len);
的上面那一個connfd

另外,必需注意一點的是,當因為有資料可以讀取而觸發時,若沒有立刻把QSocketNotifier刪掉,則會一直觸發這一個function,若你的資料一直沒有讀取的話。

例如:
QObject::connect( sn, SIGNAL(activated(int)),myObject, SLOT(dataReceived()) );

dataReceived()的內容的第一行必需為
delete sn;
如此一來才可以安心的接收資料,而不因為一直有資料要讀取,而一直觸發這一個function

沒有留言: