2014-01-12 53 views
0

我嘗試編寫一個小小的客戶端服務器程序。客戶端應該檢測運行在同一局域網中的所有服務器。我試圖用qt實現UDP-Broadcast,但是我的讀取函數始終返回-1。如果我在套接字上調用dataAvailable()-函數,它說4個字節可供讀取,但由於某種原因,它無法讀取它們。Qt UDP讀取錯誤

現在我想收到同一臺機器上,並在同一個節目廣播

這裏是我的主:

#include <iostream> 
#include <QString> 
#include <QThread> 

#include "../include/network.h" 

using namespace std; 
using namespace network; 

int main() { 
    Network *n = new Network(); 
    n->broadcast("test"); 

    if (n->dataAvailable()) { 
     cout << "Data available: "; 
     cout << n->getData().toStdString() << std::endl; 
    } else { 
     cout << "No data" << endl; 
    } 
    delete n; 
} 

和我的網絡級:

#ifndef NETWORK 
#define NETWORK 

#include <QObject> 
#include <QUdpSocket> 
#include <iostream> 

namespace network { 

    class Network : public QObject { 
     Q_OBJECT 
    public: 
     const static int BROADCAST_PORT = 52433; 

     explicit Network(QObject *parent = 0) { 
      socket = new QUdpSocket(); 
      socket->bind (QHostAddress::Any, BROADCAST_PORT); 
     } 

     ~Network() { 
      delete socket; 
     } 

     bool dataAvailable() { 
      return socket->hasPendingDatagrams(); 
     } 

     QString getData() { 
      if (!dataAvailable()) { 
       return ""; 
      } 
      char *data = 0; 
      std::cout << socket->pendingDatagramSize() << std::endl; 
      std::cout << QString("recv: %1") 
        .arg(socket->readDatagram(data, 
           socket->pendingDatagramSize())).toStdString(); 
      return QString(data); 
     } 

     void broadcast(QString data) { 
      QUdpSocket *broadcast = new QUdpSocket(); 
      broadcast->connectToHost(QHostAddress::Broadcast, BROADCAST_PORT); 
      std::cout << broadcast->write(data.toStdString().c_str()) 
         << std::endl << std::endl; 
      delete broadcast; 
     } 

    private: 
     QUdpSocket *socket; 
    }; 

} 

#endif // NETWORK 

的輸出如下:

4 

Data available: 4 
recv -1 

這意味着

  1. 4字節從廣播發送
  2. 插座檢測到4個字節可用
  3. 將試圖讀取4個字節失敗
  4. getData()返回的字符串是空

很抱歉,我找不到任何可能獲取有關錯誤的更多信息

+1

我不知道Qt的是如何工作的,但通常當一個系統調用,比如['recvfrom的(2)'](http://linux.die.net/man/2/recvfrom)失敗,它返回「-1」,並將錯誤代碼設置爲全局變量「errno」。如果你檢查了'errno'的值,你可能會發現'errno'是'EFAULT',表明你向內核傳遞了一個無效的地址,假設'errno'沒有被Qt重置。 –

+0

不幸的是,我不知道'errno' :(你能推薦一個很好的閱讀嗎? – Qw3ry

回答

3

您肯定需要爲讀取數據報分配內存。現在您嘗試將其寫入空指針。

// char *data = 0; 
std::cout << socket->pendingDatagramSize() << std::endl; 
QVector<char> buffer(socket->pendingDatagramSize()); // create buffer 
std::cout << QString("recv: %1") 
     .arg(socket->readDatagram(buffer.data(), 
       socket->pendingDatagramSize())).toStdString(); 
+0

謝謝,這解決了這個問題。我認爲這個函數自己分配它需要的內存,並且char *指針設置爲內存的地址 但是這種方法的大小參數也是有意義的。 – Qw3ry