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
這意味着
- 4字節從廣播發送
- 插座檢測到4個字節可用
- 將試圖讀取4個字節失敗
- 由
getData()
返回的字符串是空
很抱歉,我找不到任何可能獲取有關錯誤的更多信息
我不知道Qt的是如何工作的,但通常當一個系統調用,比如['recvfrom的(2)'](http://linux.die.net/man/2/recvfrom)失敗,它返回「-1」,並將錯誤代碼設置爲全局變量「errno」。如果你檢查了'errno'的值,你可能會發現'errno'是'EFAULT',表明你向內核傳遞了一個無效的地址,假設'errno'沒有被Qt重置。 –
不幸的是,我不知道'errno' :(你能推薦一個很好的閱讀嗎? – Qw3ry